@hology/core 0.0.31 → 0.0.32

Sign up to get free protection for your applications and to get access to all the features.
package/dist/csm.js CHANGED
@@ -1,4 +1,4 @@
1
- import*as e from"three";const n=e.Object3D.prototype.add,t=new WeakMap,a=new WeakMap;export const CSMUtil={renderingView:null,onBeforeCompile(e,n){e.defines=e.defines||{},e.defines.USE_CSM=1,e.defines.CSM_CASCADES=this.renderingView.csm.cascades;const t=Math.min(this.renderingView.camera.far,this.renderingView.csm.maxFar),a=[];this.renderingView.csm.getExtendedBreaks(a),n.uniforms.CSM_cascades={value:a},n.uniforms.cameraNear={value:this.renderingView.camera.near},n.uniforms.shadowFar={value:t}},patchThreeAdd(){const r=this.renderingView;t.set(r.scene,r.csm),e.Object3D.prototype.add=function(...r){let i=this;for(;null!=i.parent;)i=i.parent;const s=i,o=t.get(s);if(null==o)return n.apply(this,arguments),this;a.has(s)||a.set(s,new WeakSet);const c=a.get(s);function d(e){e&&!c.has(e)&&(c.add(e),null==o||o.setupMaterial(e))}return r.forEach((n=>null==n?void 0:n.traverse((n=>{if(n instanceof e.Mesh||n instanceof e.SkinnedMesh)if(n.material instanceof Array)for(const e of n.material)d(e);else d(n.material)})))),n.apply(this,arguments),this}}};
1
+ import*as e from"three";const n=e.Object3D.prototype.add,r=new WeakMap,a=new WeakMap;export const CSMUtil=new class{constructor(){this.renderingView=null}onBeforeCompile(n,r){n.defines=n.defines||{},n.defines.USE_CSM=1,n.defines.CSM_CASCADES=this.renderingView.csm.cascades;const a=this.renderingView.camera instanceof e.PerspectiveCamera?this.renderingView.camera.far:Number.MAX_SAFE_INTEGER,t=this.renderingView.camera instanceof e.PerspectiveCamera?this.renderingView.camera.near:0,i=Math.min(a,this.renderingView.csm.maxFar),s=[];this.renderingView.csm.getExtendedBreaks(s),r.uniforms.CSM_cascades={value:s},r.uniforms.cameraNear={value:t},r.uniforms.shadowFar={value:i}}patchThreeAdd(){const t=this.renderingView;r.set(t.scene,t.csm),e.Object3D.prototype.add=function(...t){let i=this;for(;null!=i.parent;)i=i.parent;const s=i,c=r.get(s);if(null==c)return n.apply(this,arguments),this;a.has(s)||a.set(s,new WeakSet);const o=a.get(s);function d(e){e&&!o.has(e)&&(o.add(e),null==c||c.setupMaterial(e))}return t.forEach((n=>null==n?void 0:n.traverse((n=>{if(n instanceof e.Mesh||n instanceof e.SkinnedMesh)if(n.material instanceof Array)for(const e of n.material)d(e);else d(n.material)})))),n.apply(this,arguments),this}}};
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -1,4 +1,4 @@
1
- import{__awaiter as t,__decorate as s}from"tslib";import{Actor as e,BaseActor as i,AssetLoader as o,inject as r,World as a}from"../../gameplay";import{Rate as h}from"three-nebula";import{OnceRate as m}from"./rates";import{materializeVfx as l}from"./vfx-materializer";import*as d from"three";let n=class extends i{constructor(){super(...arguments),this.timescale=1,this.paused=!1,this.assetLoader=r(o),this.world=r(a),this._worldPos=new d.Vector3,this.max=0}fromAsset(s){return t(this,void 0,void 0,(function*(){null!=this.system&&(this.system.destroy(),this.system.emitters.forEach((t=>t.reset()))),this.sourceAsset=s,this.disposeSystem&&this.disposeSystem();const{system:t,dispose:e}=yield l(s,this.world.scene,{getMaterial:t=>this.assetLoader.getMaterialByAssetId(t),getTexture:t=>this.assetLoader.getTextureByAssetId(t),getMesh:t=>this.assetLoader.getModelByAssetId(t).then((t=>t.scene))});this.system=t,this.disposeSystem=e}))}play(){this.paused=!1;this.system.emitters.every((t=>t.dead))&&this.restart()}pause(){this.paused=!0}stop(){this.system.emitters.forEach((t=>{const s=t.rate;s instanceof h&&(console.log("set rate to infinity",s),s.nextTime=1/0)}))}restart(){for(const t of this.system.emitters){t.removeAllParticles();const s=t.rate;s.nextTime=0,s instanceof m&&s.restart()}}onUpdate(t){var s,e;this.paused||(this.object.getWorldPosition(this._worldPos),null===(s=this.system)||void 0===s||s.emitters.forEach((t=>{t.setPosition(this._worldPos)})),null===(e=this.system)||void 0===e||e.update(t*this.timescale))}getParticleCount(){var t,s;return null!==(s=null===(t=this.system)||void 0===t?void 0:t.getCount())&&void 0!==s?s:0}onEndPlay(){this.stop(),console.log("end play"),null!=this.disposeSystem&&this.disposeSystem()}};n=s([e()],n);export{n as VfxActor};
1
+ import{__awaiter as s,__decorate as t}from"tslib";import{Actor as e,BaseActor as i,AssetLoader as o,inject as r,World as a}from"../../gameplay";import{Rate as h}from"three-nebula";import{materializeVfx as d}from"./vfx-materializer";import*as l from"three";let m=class extends i{constructor(){super(...arguments),this.timescale=1,this.paused=!1,this.assetLoader=r(o),this.world=r(a),this._worldPos=new l.Vector3,this.max=0}fromAsset(t){return s(this,void 0,void 0,(function*(){null!=this.system&&(this.system.destroy(),this.system.emitters.forEach((s=>s.reset()))),this.sourceAsset=t,this.disposeSystem&&this.disposeSystem();const{system:s,dispose:e}=yield d(t,this.world.scene,{getAsset:s=>this.assetLoader.getAsset(s),getMaterial:s=>this.assetLoader.getMaterialByAssetId(s),getTexture:s=>this.assetLoader.getTextureByAssetId(s),getMesh:s=>this.assetLoader.getModelByAssetId(s).then((s=>s.scene))});this.system=s,this.disposeSystem=e}))}play(){this.paused=!1;this.system.emitters.every((s=>s.dead))&&this.restart()}pause(){this.paused=!0}stop(){this.system.emitters.forEach((s=>{const t=s.rate;t instanceof h&&(console.log("set rate to infinity",t),t.nextTime=1/0)}))}restart(){for(const s of this.system.emitters){s.rate.nextTime=0,s.removeAllParticles()}}onUpdate(s){var t,e;this.paused||(this.object.getWorldPosition(this._worldPos),null===(t=this.system)||void 0===t||t.emitters.forEach((s=>{s.setPosition(this._worldPos)})),null===(e=this.system)||void 0===e||e.update(s*this.timescale))}getParticleCount(){var s,t;return null!==(t=null===(s=this.system)||void 0===s?void 0:s.getCount())&&void 0!==t?t:0}onEndPlay(){this.stop(),console.log("end play"),null!=this.disposeSystem&&this.disposeSystem()}};m=t([e()],m);export{m as VfxActor};
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -1,4 +1,4 @@
1
- import{Color as e,MathUtils as r,Vector2 as t,Vector3 as s}from"three";import{Life as n,Force as a,Gravity as o,Scale as i,RandomDrift as c,Color as u,Alpha as m,Rotate as p,Mass as d,ease as l,Position as f,BoxZone as w,LineZone as x}from"three-nebula";import{LinearDamping as y,MoveOverLife as h,RotatePosition as k}from"./behaviours";import{AdditiveVelocity as b,InitialScale as v,RandomDirection as z,Rotation as g}from"./initializsers";import{SphereZone as L,PointZone as V}from"./zones";class B{build(e={}){const r=R(e,this.parameters);return this.make(r)}}class O{build(e={}){const r=R(e,this.parameters);return this.make(r)}}function T(e,r,t){return{type:"number",default:e,float:!0,min:r,max:t}}function j(e){return{type:"vec3",default:(new s).fromArray(e)}}function D(e){return{type:"color",default:e}}function I(){return{type:"select",opts:Array.from(Object.keys(l)).map((e=>e.substring(4))),default:"Linear"}}function R(e,r){const t={};for(let s in r)null==e[s]?t[s]=r[s].default:t[s]=e[s];return t}function A(e){return null!=e?l["ease"+e]:l.easeLinear}const C={lifetime:new class extends O{constructor(){var e;super(...arguments),this.parameters={duration:(e=1,{type:"number",default:e})}}make(e={}){return new n(e.duration)}},positionPoint:new class extends O{constructor(){super(...arguments),this.parameters={position:j([0,0,0])}}make(e={}){const{x:r,y:t,z:s}=e.position;return new f(new V(r,t,s))}},positionBox:new class extends O{constructor(){super(...arguments),this.parameters={position:j([0,0,0]),dimensions:j([0,0,0])}}make(e={}){const{x:r,y:t,z:s}=e.position,{x:n,y:a,z:o}=e.dimensions;return new f(new w(r,t,s,n,a,o))}},positionSphere:new class extends O{constructor(){super(...arguments),this.parameters={position:j([0,0,0]),radius:T(1)}}make(e={}){const{x:r,y:t,z:s}=e.position;return new f(new L(r,t,s,e.radius))}},positionLine:new class extends O{constructor(){super(...arguments),this.parameters={a:j([0,0,0]),b:j([0,0,1])}}make(e={}){const{x:r,y:t,z:s}=e.a,{x:n,y:a,z:o}=e.b;return new f(new x(r,t,s,n,a,o))}},rotation:new class extends O{constructor(){super(...arguments),this.parameters={rotation:j([0,0,0])}}make(e={}){const{x:r,y:t,z:n}=e.rotation;return new g(new s(r,t,n))}},scale:new class extends O{constructor(){super(...arguments),this.parameters={scale:T(1)}}make(e={}){return new v(e.scale)}},mass:new class extends O{constructor(){super(...arguments),this.parameters={min:T(1)}}make(e={}){return new d(e.min)}},velocity:new class extends O{constructor(){super(...arguments),this.parameters={velocity:j([0,0,0])}}make(e={}){const{x:r,y:t,z:n}=e.velocity;return new b(new s(r,t,n))}},randomDirection:new class extends O{constructor(){super(...arguments),this.parameters={speed:T(1)}}make(e={}){return new z(e.speed)}}},K={force:new class extends B{constructor(){super(...arguments),this.parameters={force:j([0,0,0]),ease:I()}}make(e={}){return new a(e.force.x,e.force.y,e.force.z,void 0,A(e.ease))}},gravity:new class extends B{constructor(){super(...arguments),this.parameters={gravity:T(8)}}make(e={}){return new o(e.gravity)}},scale:new class extends B{constructor(){super(...arguments),this.parameters={a:T(1),b:T(1),ease:I()}}make(e={}){return new i(e.a,e.b,void 0,A(e.ease))}},randomDrift:new class extends B{constructor(){super(...arguments),this.parameters={drift:j([1,1,1]),delay:T(0),ease:I()}}make(e={}){return new c(e.drift.x,e.drift.y,e.drift.z,e.delay,void 0,A(e.ease))}},rotate:new class extends B{constructor(){super(...arguments),this.parameters={rotation:j([1,1,1]),ease:I()}}make(e={}){const{x:t,y:s,z:n}=e.rotation;return new p(r.degToRad(t),r.degToRad(s),r.degToRad(n),void 0,A(e.ease))}},changeColor:new class extends B{constructor(){super(...arguments),this.parameters={a:D("#ffffff"),b:D("#ffffff"),ease:I()}}make(r={}){return new u(new e(r.a),new e(r.b),void 0,A(r.ease))}},changeOpacity:new class extends B{constructor(){super(...arguments),this.parameters={a:T(1,0,1),b:T(0,0,1),ease:I()}}make(e={}){return new m(e.a,e.b,void 0,A(e.ease))}},vortex:new class extends B{constructor(){super(...arguments),this.parameters={axis:j([0,1,0]),amount:T(1)}}make(e={}){return new k(e.axis,e.amount)}},moveTo:new class extends B{constructor(){super(...arguments),this.parameters={target:j([0,1,0]),ease:I()}}make(e={}){return new h(e.target.x,e.target.y,e.target.z,A(e.ease))}},linearDamping:new class extends B{constructor(){super(...arguments),this.parameters={factor:T(.1,0,1)}}make(e={}){return new y(e.factor)}}};export const VfxInitializserLibrary=C;export const VfxInitializserLibraryKeys=Object.keys(VfxInitializserLibrary);export const VfxBehaviourLibrary=K;export const VfxBehaviourLibraryKeys=Object.keys(VfxBehaviourLibrary);
1
+ import{Color as e,MathUtils as r,Vector2 as t,Vector3 as s}from"three";import{Life as n,Force as a,Gravity as o,Scale as i,RandomDrift as c,Color as u,Alpha as m,Rotate as p,Mass as d,ease as l,Position as f,BoxZone as w,LineZone as x}from"three-nebula";import{LinearDamping as y,MoveOverLife as h,RotatePosition as k}from"./behaviours";import{AdditiveVelocity as b,InitialScale as v,RandomDirection as z,Rotation as g}from"./initializsers";import{SphereZone as L,PointZone as V}from"./zones";class B{build(e={}){const r=R(e,this.parameters);return this.make(r)}}class O{build(e={}){const r=R(e,this.parameters);return this.make(r)}}function T(e,r,t){return{type:"number",default:e,float:!0,min:r,max:t}}function j(e){return{type:"vec3",default:(new s).fromArray(e)}}function D(e){return{type:"color",default:e}}function I(){return{type:"select",opts:Array.from(Object.keys(l)).map((e=>e.substring(4))),default:"Linear"}}function R(e,r){const t={};for(let s in r)null==e[s]?t[s]=r[s].default:t[s]=e[s];return t}function A(e){return null!=e?l["ease"+e]:l.easeLinear}const C={lifetime:new class extends O{constructor(){var e;super(...arguments),this.parameters={duration:(e=1,{type:"number",default:e})}}make(e={}){return new n(e.duration)}},positionPoint:new class extends O{constructor(){super(...arguments),this.parameters={position:j([0,0,0])}}make(e={}){const{x:r,y:t,z:s}=e.position;return new f(new V(r,t,s))}},positionBox:new class extends O{constructor(){super(...arguments),this.parameters={position:j([0,0,0]),dimensions:j([0,0,0])}}make(e={}){const{x:r,y:t,z:s}=e.position,{x:n,y:a,z:o}=e.dimensions;return new f(new w(r,t,s,n,a,o))}},positionSphere:new class extends O{constructor(){super(...arguments),this.parameters={position:j([0,0,0]),radius:T(1)}}make(e={}){const{x:r,y:t,z:s}=e.position;return new f(new L(r,t,s,e.radius))}},positionLine:new class extends O{constructor(){super(...arguments),this.parameters={a:j([0,0,0]),b:j([0,0,1])}}make(e={}){const{x:r,y:t,z:s}=e.a,{x:n,y:a,z:o}=e.b;return new f(new x(r,t,s,n,a,o))}},rotation:new class extends O{constructor(){super(...arguments),this.parameters={rotation:j([0,0,0])}}make(e={}){const{x:r,y:t,z:n}=e.rotation;return new g(new s(r,t,n))}},scale:new class extends O{constructor(){super(...arguments),this.parameters={scale:T(1)}}make(e={}){return new v(e.scale)}},mass:new class extends O{constructor(){super(...arguments),this.parameters={min:T(1)}}make(e={}){return new d(e.min)}},velocity:new class extends O{constructor(){super(...arguments),this.parameters={velocity:j([0,0,0])}}make(e={}){const{x:r,y:t,z:n}=e.velocity;return new b(new s(r,t,n))}},randomDirection:new class extends O{constructor(){super(...arguments),this.parameters={speed:T(1)}}make(e={}){return new z(e.speed)}}},K={force:new class extends B{constructor(){super(...arguments),this.parameters={force:j([0,0,0]),ease:I()}}make(e={}){return new a(e.force.x,e.force.y,e.force.z,void 0,A(e.ease))}},gravity:new class extends B{constructor(){super(...arguments),this.parameters={gravity:T(8)}}make(e={}){return new o(e.gravity)}},scale:new class extends B{constructor(){super(...arguments),this.parameters={a:T(1),b:T(1),ease:I()}}make(e={}){return new i(e.a,e.b,void 0,A(e.ease))}},randomDrift:new class extends B{constructor(){super(...arguments),this.parameters={drift:j([1,1,1]),delay:T(0),ease:I()}}make(e={}){return new c(e.drift.x,e.drift.y,e.drift.z,e.delay,void 0,A(e.ease))}},rotate:new class extends B{constructor(){super(...arguments),this.parameters={rotation:j([0,0,0]),ease:I()}}make(e={}){const{x:t,y:s,z:n}=e.rotation;return new p(r.degToRad(t),r.degToRad(s),r.degToRad(n),void 0,A(e.ease))}},changeColor:new class extends B{constructor(){super(...arguments),this.parameters={a:D("#ffffff"),b:D("#ffffff"),ease:I()}}make(r={}){return new u(new e(r.a),new e(r.b),void 0,A(r.ease))}},changeOpacity:new class extends B{constructor(){super(...arguments),this.parameters={a:T(1,0,1),b:T(0,0,1),ease:I()}}make(e={}){return new m(e.a,e.b,void 0,A(e.ease))}},vortex:new class extends B{constructor(){super(...arguments),this.parameters={axis:j([0,1,0]),amount:T(1)}}make(e={}){return new k(e.axis,e.amount)}},moveTo:new class extends B{constructor(){super(...arguments),this.parameters={target:j([0,1,0]),ease:I()}}make(e={}){return new h(e.target.x,e.target.y,e.target.z,A(e.ease))}},linearDamping:new class extends B{constructor(){super(...arguments),this.parameters={factor:T(.1,0,1)}}make(e={}){return new y(e.factor)}}};export const VfxInitializserLibrary=C;export const VfxInitializserLibraryKeys=Object.keys(VfxInitializserLibrary);export const VfxBehaviourLibrary=K;export const VfxBehaviourLibraryKeys=Object.keys(VfxBehaviourLibrary);
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -1,8 +1,9 @@
1
- import { VfxAsset } from "../../scene/model";
1
+ import { Asset, VfxAsset } from "../../scene/model";
2
2
  import { Object3D } from "three";
3
3
  import * as THREE from 'three';
4
4
  import System, { MeshRenderer, Rate } from "three-nebula";
5
5
  export type VfxAssetProvider = {
6
+ getAsset(assetId: string): Promise<Asset>;
6
7
  getTexture(assetId: string): Promise<THREE.Texture>;
7
8
  getMesh(assetId: string): Promise<THREE.Object3D>;
8
9
  getMaterial(assetId: string): Promise<THREE.Material>;
@@ -1,4 +1,4 @@
1
- import{__awaiter as e}from"tslib";import{Object3D as t}from"three";import*as r from"three";import a,{Behaviour as n,Body as i,BoxZone as o,Emitter as s,Force as l,Life as d,Mass as m,MeshRenderer as c,PUID as u,PointZone as p,Position as h,RadialVelocity as w,Radius as f,Rate as A,Rotate as g,Scale as y,Span as v,Vector3D as b,ease as M}from"three-nebula";import{RotatePosition as x}from"./behaviours";import{OnceRate as B}from"./rates";import{VfxBehaviourLibrary as S,VfxInitializserLibrary as I}from"./vfx-defs";import{ThreeBlendingMode as E}from"./vfx-asset";import{ShapeLibrary as P}from"../../scene/objects/shapes";import{prepareShapeParameters as R,shapeDefaultColor as Q}from"../../scene/materializer";import{particleEnergyUniformName as U,particleVelcoityUniformName as V}from"../../shader-nodes/particle";import{NodeShaderMaterial as k}from"three-shader-graph";class F extends c{scale(e){e.target instanceof r.Sprite?e.target.scale.set(e.scale*e.radius,e.scale*e.radius,1):super.scale(e)}onParticleCreated(e){e.target||(e.body||(e.body=this._body),e.target=this._targetPool.get(e.body),(e.useAlpha||e.useColor)&&(e.target instanceof r.Mesh||e.target instanceof r.Sprite&&e.target.material instanceof r.Material)&&(e.target.material.__puid=u.id(e.body.material),e.target.material=this._materialPool.get(e.target.material))),e.target&&e.target instanceof t&&(e.target.position.set(e.position.x,e.position.y,e.position.z),this.container.add(e.target))}onParticleUpdate(e){const{target:t,useAlpha:a,useColor:n,rotation:i}=e;t&&(t.position.copy(e.position),this.isThreeSprite(e)||t.rotation.set(i.x,i.y,i.z),this.scale(e),t.material instanceof r.Material&&(a&&(t.material.opacity=e.alpha,t.material.transparent=!0),n&&t.material.color.copy(e.color)))}onParticleDead(e){e.target&&e.target.material&&((e.useAlpha||e.useColor)&&this._materialPool.expire(e.target.material),this._targetPool.expire(e.target),this.container.remove(e.target),e.target=null)}}export function materializeVfx(n,o,l){return e(this,void 0,void 0,(function*(){let d=o;if(!0!==n.vfx.localSpace)for(;null!=d.parent;)d=d.parent;const m=new t;m.name="particle system",d.add(m);const c=new F(m,r),u=(new r.Mesh(new r.BoxGeometry(.3,.3,.3),new r.MeshStandardMaterial({color:16777215})),new a),p=yield Promise.all(n.vfx.emitters.map((a=>e(this,void 0,void 0,(function*(){let n,o;switch(a.rate.type){case"continuous":n=new A(a.rate.count,a.rate.time);break;case"once":n=new B(a.rate.count);break;default:console.warn(`Failed to configure rate for emitter: ${JSON.stringify(a)}`),n=new A(0,1/0)}switch(a.output.type){case"sprite":o=new i(yield function(t,a){var n,i;return e(this,void 0,void 0,(function*(){const e=null!=t.texture?yield a.getTexture(t.texture):C;var o=new r.SpriteMaterial({map:e,color:null!==(n=t.color)&&void 0!==n?n:16777215,blending:null!==(i=E[t.blendingMode])&&void 0!==i?i:r.NormalBlending,fog:!0,transparent:!0});return new r.Sprite(o)}))}(a.output,l));break;case"shape":o=new i(yield function(a,n){var i;return e(this,void 0,void 0,(function*(){const e=P[a.shape];if(null==e)return console.error(`No shape with type ${a.shape}`),new t;const o=R(null!==(i=a.params)&&void 0!==i?i:{}),s=e.geometry(o),l=null!=a.material?yield n.getMaterial(a.material):new r.MeshStandardMaterial({color:Q});return new r.Mesh(s,l)}))}(a.output,l));break;case"mesh":o=new i(yield function(r,a){return e(this,void 0,void 0,(function*(){return null==r.assetId?(console.warn("Can't use mesh as particle without asset id"),new t):a.getMesh(r.assetId)}))}(a.output,l));break;default:console.error("Failed to create particly system body: "+JSON.stringify(a))}const d=(new s).setRate(n),m=yield Promise.all(a.initializers.filter((e=>null!=I[e.type])).map((t=>e(this,void 0,void 0,(function*(){var e;const r=I[t.type],a=yield R(null!==(e=t.params)&&void 0!==e?e:{});return r.build(a)})))));m.push(o),d.addInitializers(m);const c=yield Promise.all(a.behaviours.filter((e=>null!=S[e.type])).map((t=>e(this,void 0,void 0,(function*(){var e;const r=S[t.type],a=yield R(null!==(e=t.params)&&void 0!==e?e:{});return r.build(a)})))));return c.push(new H),d.addBehaviours(c),d.emit()})))));return p.forEach((e=>u.addEmitter(e))),u.addRenderer(c).emit({onEnd:()=>{console.log("ended")}}),{system:u,dispose:()=>m.removeFromParent()}}))}const C=(new r.TextureLoader).load("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJkSURBVHjaxJeJbusgEEW94S1L//83X18M2MSuLd2pbqc4wZGqRLrKBsyZhQHny7Jk73xVL8xpVhWrcmiB5lX+6GJ5YgQ2owbAm8oIwH1VgKZUmGcRqKGGPgtEQQAzGR8hQ59fAmhJHSAagigJ4E7GPWRXOYC6owAd1JM6wDQPADyMWUqZRMqmAojHp1Vn6EQQEgUNMJLnUjMyJsM49wygBkAPw9dVFwXRkncCIIW3GRgoTQUZn6HxCMAFEFd8TwEQ78X4rHbILoAUmeT+RFG4UhQ6MiIAE4W/UsYFjuVjAIa2nIY4q1R0GFtQWG3E84lqw2GO2QOoCKBVu0BAPgDSU0eUDjjQenNkV/AW/pWChhpMTelo1a64AOKM30vk18GzTHXCNtI/Knz3DFBgsUqBGIjTInXRY1yA9xkVoqW5tVq3pDR9A0hfF5BSARmVnh7RMDCaIdcNgbPBkgzn1Bu+SfIEFSpSBmkxyrMicb0fAEuCZrWnN89veA/4XcakrPcjBWzkTuLjlbfTQPOlBhz+HwkqqPXmPQDdrQItxE1moGof1S74j/8txk8EHhTQrAE8qlwfqS5yukm1x/rAJ9Jiaa6nyATqD78aUVBhFo8b1V4DdTXdCW+IxA1zB4JhiOhZMEWO1HqnvdoHZ4FAMIhV9REF8FiUm0jsYPEJx/Fm/N8OhH90HI9YRHesWbXXZwAShU8qThe7H8YAuJmw5yOd989uRINKRTJAhoF8jbqrHKfeCYdIISZfSq26bk/K+yO3YvfKrVgiwQBHnwt8ynPB25+M8hceTt/ybPhnryJ78+tLgAEAuCFyiQgQB30AAAAASUVORK5CYII=");export function materializeVfxOld(e,n){let u=n;if(!0!==e.vfx.localSpace)for(;null!=u.parent;)u=u.parent;const S=new t;S.name="particle system",u.add(S);const I=new c(S,r),E=new r.Mesh(new r.BoxGeometry(.3,.3,.3),new r.MeshStandardMaterial({color:16777215})),P=new A(new v(3,9),new v(.02,.15)),R=new s,Q=new a;R.setLife(4).setRate(P).addInitializers([new m(1),new f(1),new d(1),new i(E),new h(new o(.5)),new w(10,new b(0,0,1),30)]).addBehaviours([new x(new r.Vector3(0,0,1),4),new l(0,0,.1),new g("random",2.5*-Math.PI,2*Math.PI,1,M.easeOutCubic),new y(1,.2)]).emit();const U=new B,V=(new s).setLife(5).addInitializers([new m(1),new f(1),new d(3),new i(E),new h(new p(0,0,0))]).addBehaviours([new y(4,6,void 0,M.easeOutExpo)]).setRate(U).emit();return U.nextTime=0,Q.addEmitter(R).addEmitter(V).addRenderer(I).emit({onEnd:()=>{console.log("ended")}}),{system:Q,rate:P,renderer:I,dispose:()=>S.removeFromParent()}}class H extends n{initialize(e){if(e.body instanceof r.Mesh){const t=e.body.material;t instanceof k&&(null!=t.uniforms[U]||null!=t.uniforms[V])&&(e.body.material=t.clone())}}mutate(e,t,a){if(e.target instanceof r.Mesh){const t=e.target.material;t instanceof k&&(null!=t.uniforms[U]&&(t.uniforms[U].value=this.energy),null!=t.uniforms[V]&&(t.uniforms[V].value=e.velocity))}}}
1
+ import{__awaiter as e}from"tslib";import{Object3D as t}from"three";import*as a from"three";import r,{Behaviour as n,Body as i,BoxZone as o,Emitter as s,Force as l,Life as d,Mass as m,MeshRenderer as c,PUID as u,PointZone as p,Position as h,RadialVelocity as f,Radius as w,Rate as g,Rotate as A,Scale as y,Span as v,Vector3D as M,ease as x}from"three-nebula";import{RotatePosition as b}from"./behaviours";import{OnceRate as I}from"./rates";import{VfxBehaviourLibrary as S,VfxInitializserLibrary as B}from"./vfx-defs";import{ThreeBlendingMode as E}from"./vfx-asset";import{ShapeLibrary as P}from"../../scene/objects/shapes";import{prepareShapeParameters as R,shapeDefaultColor as Q}from"../../scene/materializer";import{particleEnergyUniformName as U,particleVelcoityUniformName as V}from"../../shader-nodes/particle";import{NodeShaderMaterial as k}from"three-shader-graph";class C extends c{scale(e){e.target instanceof a.Sprite?e.target.scale.set(e.scale*e.radius,e.scale*e.radius,1):super.scale(e)}rotate(e){e.target.material.rotation=e.rotation.z}onParticleCreated(e){e.target||(e.target=this._targetPool.get(e.body),(e.useAlpha||e.useColor)&&(e.target instanceof a.Mesh||e.target instanceof a.Sprite&&e.target.material instanceof a.Material)&&(e.target.material.__puid=u.id(e.body.material),e.target.material=this._materialPool.get(e.target.material))),e.target&&e.target instanceof t&&(e.target.position.set(e.position.x,e.position.y,e.position.z),this.container.add(e.target))}onParticleUpdate(e){const{target:t,useAlpha:r,useColor:n,rotation:i}=e;t&&(t.position.copy(e.position),this.isThreeSprite(e)||t.rotation.set(i.x,i.y,i.z),this.scale(e),t.material instanceof a.Material&&(r&&(t.material.opacity=e.alpha,t.material.transparent=!0),n&&t.material.color.copy(e.color)))}onParticleDead(e){e.target&&(e.target.material&&(e.useAlpha||e.useColor)&&this._materialPool.expire(e.target.material),this._targetPool.expire(e.target),this.container.remove(e.target),e.target=null)}}export function materializeVfx(n,o,l){return e(this,void 0,void 0,(function*(){let d=o;if(!0!==n.vfx.localSpace)for(;null!=d.parent;)d=d.parent;const m=new t;m.name="particle system",d.add(m);const c=new C(m,a),u=(new a.Mesh(new a.BoxGeometry(.3,.3,.3),new a.MeshStandardMaterial({color:16777215})),new r),p=yield Promise.all(n.vfx.emitters.map((r=>e(this,void 0,void 0,(function*(){let n,o;switch(r.rate.type){case"continuous":n=new g(r.rate.count,r.rate.time);break;case"once":n=new I(r.rate.count);break;default:console.warn(`Failed to configure rate for emitter: ${JSON.stringify(r)}`),n=new g(0,1/0)}switch(r.output.type){case"sprite":o=new i(yield function(t,r){var n,i;return e(this,void 0,void 0,(function*(){const e=null!=t.texture?yield r.getTexture(t.texture):F;var o=new a.SpriteMaterial({map:e,color:null!==(n=t.color)&&void 0!==n?n:16777215,blending:null!==(i=E[t.blendingMode])&&void 0!==i?i:a.NormalBlending,fog:!0,transparent:!0});return new a.Sprite(o)}))}(r.output,l));break;case"shape":o=new i(yield function(r,n){var i;return e(this,void 0,void 0,(function*(){const e=P[r.shape];if(null==e)return console.error(`No shape with type ${r.shape}`),new t;const o=R(null!==(i=r.params)&&void 0!==i?i:{}),s=e.geometry(o),l=null!=r.material?yield n.getMaterial(r.material):new a.MeshStandardMaterial({color:Q});return new a.Mesh(s,l)}))}(r.output,l));break;case"mesh":o=new i(yield function(r,n){return e(this,void 0,void 0,(function*(){if(null==r.assetId)return console.warn("Can't use mesh as particle without asset id"),new t;const e=yield n.getMesh(r.assetId),i=yield n.getAsset(r.assetId),o=[];if(null!=i.materialAssignments)for(const t of i.materialAssignments)e.traverse((e=>{e instanceof a.Mesh&&e.material instanceof a.Material&&e.material.color instanceof a.Color&&(e.material.name!=t.name&&null!=t.name||"#"+e.material.color.getHexString()!==t.color||o.push(n.getMaterial(t.materialId).then((t=>e.material=t))))}));return yield Promise.all(o),e.traverse((e=>{})),e}))}(r.output,l));break;default:console.error("Failed to create particly system body: "+JSON.stringify(r))}const d=(new s).setRate(n),m=yield Promise.all(r.initializers.filter((e=>null!=B[e.type])).map((t=>e(this,void 0,void 0,(function*(){var e;const a=B[t.type],r=yield R(null!==(e=t.params)&&void 0!==e?e:{});return a.build(r)})))));m.push(o),d.addInitializers(m);const c=yield Promise.all(r.behaviours.filter((e=>null!=S[e.type])).map((t=>e(this,void 0,void 0,(function*(){var e;const a=S[t.type],r=yield R(null!==(e=t.params)&&void 0!==e?e:{});return a.build(r)})))));return c.push(new H),d.addBehaviours(c),d.emit()})))));return p.forEach((e=>u.addEmitter(e))),u.addRenderer(c).emit({onEnd:()=>{console.log("ended")}}),{system:u,dispose:()=>m.removeFromParent()}}))}const F=(new a.TextureLoader).load("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJkSURBVHjaxJeJbusgEEW94S1L//83X18M2MSuLd2pbqc4wZGqRLrKBsyZhQHny7Jk73xVL8xpVhWrcmiB5lX+6GJ5YgQ2owbAm8oIwH1VgKZUmGcRqKGGPgtEQQAzGR8hQ59fAmhJHSAagigJ4E7GPWRXOYC6owAd1JM6wDQPADyMWUqZRMqmAojHp1Vn6EQQEgUNMJLnUjMyJsM49wygBkAPw9dVFwXRkncCIIW3GRgoTQUZn6HxCMAFEFd8TwEQ78X4rHbILoAUmeT+RFG4UhQ6MiIAE4W/UsYFjuVjAIa2nIY4q1R0GFtQWG3E84lqw2GO2QOoCKBVu0BAPgDSU0eUDjjQenNkV/AW/pWChhpMTelo1a64AOKM30vk18GzTHXCNtI/Knz3DFBgsUqBGIjTInXRY1yA9xkVoqW5tVq3pDR9A0hfF5BSARmVnh7RMDCaIdcNgbPBkgzn1Bu+SfIEFSpSBmkxyrMicb0fAEuCZrWnN89veA/4XcakrPcjBWzkTuLjlbfTQPOlBhz+HwkqqPXmPQDdrQItxE1moGof1S74j/8txk8EHhTQrAE8qlwfqS5yukm1x/rAJ9Jiaa6nyATqD78aUVBhFo8b1V4DdTXdCW+IxA1zB4JhiOhZMEWO1HqnvdoHZ4FAMIhV9REF8FiUm0jsYPEJx/Fm/N8OhH90HI9YRHesWbXXZwAShU8qThe7H8YAuJmw5yOd989uRINKRTJAhoF8jbqrHKfeCYdIISZfSq26bk/K+yO3YvfKrVgiwQBHnwt8ynPB25+M8hceTt/ybPhnryJ78+tLgAEAuCFyiQgQB30AAAAASUVORK5CYII=");export function materializeVfxOld(e,n){let u=n;if(!0!==e.vfx.localSpace)for(;null!=u.parent;)u=u.parent;const S=new t;S.name="particle system",u.add(S);const B=new c(S,a),E=new a.Mesh(new a.BoxGeometry(.3,.3,.3),new a.MeshStandardMaterial({color:16777215})),P=new g(new v(3,9),new v(.02,.15)),R=new s,Q=new r;R.setLife(4).setRate(P).addInitializers([new m(1),new w(1),new d(1),new i(E),new h(new o(.5)),new f(10,new M(0,0,1),30)]).addBehaviours([new b(new a.Vector3(0,0,1),4),new l(0,0,.1),new A("random",2.5*-Math.PI,2*Math.PI,1,x.easeOutCubic),new y(1,.2)]).emit();const U=new I,V=(new s).setLife(5).addInitializers([new m(1),new w(1),new d(3),new i(E),new h(new p(0,0,0))]).addBehaviours([new y(4,6,void 0,x.easeOutExpo)]).setRate(U).emit();return U.nextTime=0,Q.addEmitter(R).addEmitter(V).addRenderer(B).emit({onEnd:()=>{console.log("ended")}}),{system:Q,rate:P,renderer:B,dispose:()=>S.removeFromParent()}}class H extends n{initialize(e){if(e.body instanceof a.Mesh){const t=e.body.material;t instanceof k&&(null!=t.uniforms[U]||null!=t.uniforms[V])&&(e.body.material=t.clone())}}mutate(e,t,r){if(e.target instanceof a.Mesh){const t=e.target.material;t instanceof k&&(null!=t.uniforms[U]&&(t.uniforms[U].value=this.energy),null!=t.uniforms[V]&&(t.uniforms[V].value=e.velocity))}}}
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -1,6 +1,7 @@
1
1
  import { Constructable, ContainerInstance } from "typedi";
2
2
  import { ShaderType, ActorType } from '../shader/shader';
3
3
  import { World } from "./services/world";
4
+ import { Observable } from 'rxjs';
4
5
  type GameClass<T> = Constructable<T>;
5
6
  export type InitiateGameConfig = {
6
7
  element: HTMLElement;
@@ -39,6 +40,7 @@ export declare class HologyRuntime<T_Game = unknown> {
39
40
  status: HologyRuntimeStatus;
40
41
  gameInstance?: T_Game;
41
42
  isShutdown: boolean;
43
+ shutdownStarted: Observable<void>;
42
44
  private _resolver;
43
45
  /**
44
46
  * A promise that you can await on to delay some logic until the runtime has finished loading
@@ -1,4 +1,4 @@
1
- import{__awaiter as e}from"tslib";import t from"typedi";import{loadScene as n}from"../scene/bootstrap";import{ActorFactory as o}from"./actors/factory";import{World as s}from"./services/world";import{ViewController as r}from"./services/render";import{RenderingView as i}from"../rendering";import{PhysicsSystem as a}from"./services/physics/physics-system";import{MeshComponent as c}from"./actors/builtin/components/mesh-component";import{activeContainerInstance as m}from"./actors/internal/container-map";import{InputService as l}from"./input";import{RuntimeBackendService as d}from"../scene/runtime-backend-service";import{RuntimeAssetsService as p}from"../scene/runtime-asset-service";import{AssetResourceLoader as h}from"../scene/asset-resource-loader";import{AssetLoader as u}from"./services/asset-loader";import{polyfillClient as f}from"./polyfill";export function initiateGame(l,g){var w;if(f(),0!=g.element.childNodes.length)return console.error("Can not initialize the game with a non-empty html element"),null;t.has(r);const v=t.of("default"),y=new HologyRuntime(v),I=new o(v,{inEditor:!1});var S;t.set(o,I),S=g.element,Object.assign(S.style,{position:"absolute",top:"0",left:"0",width:"100%",height:"100%"});const b=new i(g.element,{enableXR:!0===(null===(w=g.xr)||void 0===w?void 0:w.enabled)});b.renderer.shadowMap.autoUpdate=!0,t.set(i,b);const x=new r(b);t.set(r,x);const D=new s(t.get(o));t.set(s,D);const G=new d(g.dataDir),H=new p(G),R=new h;R.setDataDir(g.dataDir);const W=Object.entries(g.shaders).map((([e,t])=>({name:e,type:t}))),j=new u(R,H,W);return t.set(u,j),(()=>{e(this,void 0,void 0,(function*(){const e=t.get(a);if(yield e.start(),y.isShutdown)return;const{scene:o,actors:s}=yield n(b,g.sceneName,g.dataDir,g.shaders,g.actors,I,G,H,R);if(D.scene=o,y.isShutdown)return void b.stop();t.import([c]);for(const e of s)D.addActor(e);e.addFromScene(o),b.loop((e=>{})),y.status=5,m.value=v,v.remove(l),v.set({id:l,type:l});const r=v.get(l);m.value=null,y.gameInstance=r,r instanceof GameInstance&&r.onStart(),y._resolver(!0)}))})(),y}export class GameInstance{onStart(){}onShutdown(){}}export function createHologyScene(){}export class HologyRuntime{constructor(e){this.containerInstance=e,this.status=0,this.isShutdown=!1,this.ready=new Promise((e=>{this._resolver=e}))}getWorld(){return this.containerInstance.get(s)}getService(e){return this.containerInstance.get(e)}shutdown(){this.isShutdown=!0,this.gameInstance instanceof GameInstance&&this.gameInstance.onShutdown(),this.containerInstance.get(l).stop();const e=this.containerInstance.get(i);null==e||e.stop();for(const e of this.getWorld().actors)this.getWorld().removeActor(e);this.containerInstance.get(a).stop(),this.containerInstance.reset()}}
1
+ import{__awaiter as t}from"tslib";import e from"typedi";import{loadScene as n}from"../scene/bootstrap";import{ActorFactory as o}from"./actors/factory";import{World as s}from"./services/world";import{ViewController as r}from"./services/render";import{RenderingView as i}from"../rendering";import{PhysicsSystem as a}from"./services/physics/physics-system";import{MeshComponent as c}from"./actors/builtin/components/mesh-component";import{activeContainerInstance as m}from"./actors/internal/container-map";import{InputService as d}from"./input";import{RuntimeBackendService as l}from"../scene/runtime-backend-service";import{RuntimeAssetsService as p}from"../scene/runtime-asset-service";import{AssetResourceLoader as h}from"../scene/asset-resource-loader";import{AssetLoader as u}from"./services/asset-loader";import{polyfillClient as f}from"./polyfill";import{Subject as w}from"rxjs";export function initiateGame(d,w){var g;if(f(),0!=w.element.childNodes.length)return console.error("Can not initialize the game with a non-empty html element"),null;e.has(r);const v=e.of("default"),y=new HologyRuntime(v),I=new o(v,{inEditor:!1});var S;e.set(o,I),S=w.element,Object.assign(S.style,{position:"absolute",top:"0",left:"0",width:"100%",height:"100%"});const b=new i(w.element,{enableXR:!0===(null===(g=w.xr)||void 0===g?void 0:g.enabled)});b.renderer.shadowMap.autoUpdate=!0,e.set(i,b);const x=new r(b);e.set(r,x);const D=new s(e.get(o));e.set(s,D);const G=new l(w.dataDir),j=new p(G),H=new h;H.setDataDir(w.dataDir);const R=Object.entries(w.shaders).map((([t,e])=>({name:t,type:e}))),W=new u(H,j,R);return e.set(u,W),(()=>{t(this,void 0,void 0,(function*(){const t=e.get(a);if(yield t.start(),y.isShutdown)return;const{scene:o,actors:s}=yield n(b,w.sceneName,w.dataDir,w.shaders,w.actors,I,G,j,H);if(D.scene=o,y.isShutdown)return void b.stop();e.import([c]);for(const t of s)D.addActor(t);t.addFromScene(o),b.loop((t=>{})),y.status=5,m.value=v,v.remove(d),v.set({id:d,type:d});const r=v.get(d);m.value=null,y.gameInstance=r,r instanceof GameInstance&&r.onStart(),y._resolver(!0)}))})(),y}export class GameInstance{onStart(){}onShutdown(){}}export function createHologyScene(){}export class HologyRuntime{constructor(t){this.containerInstance=t,this.status=0,this.isShutdown=!1,this.shutdownStarted=new w,this.ready=new Promise((t=>{this._resolver=t}))}getWorld(){return this.containerInstance.get(s)}getService(t){return this.containerInstance.get(t)}shutdown(){this.isShutdown=!0,this.shutdownStarted.next(),this.gameInstance instanceof GameInstance&&this.gameInstance.onShutdown(),this.containerInstance.get(d).stop();const t=this.containerInstance.get(i);null==t||t.stop();for(const t of this.getWorld().actors)this.getWorld().removeActor(t);this.containerInstance.get(a).stop(),this.containerInstance.reset()}}
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -4,6 +4,7 @@ import { AssetId } from "../../scene/model";
4
4
  import { GLTF } from "three-stdlib";
5
5
  import { Material } from "three";
6
6
  import { ShaderImpl } from "../../shader/shader";
7
+ import * as THREE from 'three';
7
8
  export declare class AssetLoader {
8
9
  protected assetResourceLoader: AssetResourceLoader;
9
10
  protected assetService: AssetsProvider;
@@ -36,4 +37,5 @@ export declare class AssetLoader {
36
37
  getModelByAssetId(id: AssetId): Promise<LoadedMesh>;
37
38
  getTextureByAssetId(id: AssetId): Promise<THREE.Texture>;
38
39
  getMaterialByAssetId(id: AssetId): Promise<Material>;
40
+ getAsset(id: AssetId): Promise<import("../../scene/model").Asset>;
39
41
  }
@@ -1,4 +1,4 @@
1
- import{__awaiter as e,__decorate as t,__metadata as s}from"tslib";import{AssetResourceLoader as r}from"../../scene/asset-resource-loader";import{FBXLoader as i,GLTFLoader as o,MTLLoader as a,OBJLoader as n,TGALoader as d}from"three-stdlib";import{AudioLoader as h,LoadingManager as l,TextureLoader as u}from"three";import{pathJoin as c}from"../../utils/files";import{Service as f}from"typedi";import{materialFromAsset as g}from"../../scene/materializer";let w=class{constructor(e,t,s){this.assetResourceLoader=e,this.assetService=t,this.shaders=s,this.baseUrl="",this.urlSuffix="",this.loadingManager=new l,this.glbLoader=new o(this.loadingManager),this.fbxLoader=new i(this.loadingManager),this.objLoader=new n(this.loadingManager),this.mtlLoader=new a(this.loadingManager),this.tgaLoader=new d(this.loadingManager),this.textureLoader=new u(this.loadingManager),this.audioLoader=new h(this.loadingManager)}resolvePath(e){return c(this.baseUrl,e)+this.urlSuffix}getModelAtPath(t){return e(this,void 0,void 0,(function*(){const e=this.resolvePath(t);switch(t.split(".").pop().toLowerCase()){case"glb":case"gltf":return(yield this.glbLoader.loadAsync(e)).scene;case"fbx":return this.fbxLoader.loadAsync(e);case"obj":return this.objLoader.loadAsync(e);default:throw new Error(`File suffix is not supperted in file ${t}`)}}))}geGltfAtPath(t){return e(this,void 0,void 0,(function*(){const e=this.resolvePath(t);return this.glbLoader.loadAsync(e)}))}getModelByAssetName(t){return e(this,void 0,void 0,(function*(){const e=(yield this.assetService.getAssets()).find((e=>e.name===t));if(null==e)throw new Error(`No model could be found with asset name ${t}`);return this.assetResourceLoader.getMesh(e)}))}getModelByAssetId(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetService.getAsset(t);if(null==e)throw new Error(`No model could be found with asset id ${t}`);return this.assetResourceLoader.getMesh(e)}))}getTextureByAssetId(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetService.getAsset(t);if(null==e)throw new Error(`No texture could be found with asset id ${t}`);return this.assetResourceLoader.getTexture(e)}))}getMaterialByAssetId(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetService.getAsset(t);if(null==e)throw new Error(`No material could be found with asset id ${t}`);return g(e,null,this.assetService,this.assetResourceLoader,this.shaders,!1)}))}};w=t([f(),s("design:paramtypes",[r,Object,Array])],w);export{w as AssetLoader};
1
+ import{__awaiter as e,__decorate as t,__metadata as s}from"tslib";import{AssetResourceLoader as r}from"../../scene/asset-resource-loader";import{FBXLoader as i,GLTFLoader as o,MTLLoader as a,OBJLoader as n,TGALoader as d}from"three-stdlib";import{AudioLoader as h,LoadingManager as l,TextureLoader as u}from"three";import{pathJoin as c}from"../../utils/files";import{Service as g}from"typedi";import{materialFromAsset as f}from"../../scene/materializer";let v=class{constructor(e,t,s){this.assetResourceLoader=e,this.assetService=t,this.shaders=s,this.baseUrl="",this.urlSuffix="",this.loadingManager=new l,this.glbLoader=new o(this.loadingManager),this.fbxLoader=new i(this.loadingManager),this.objLoader=new n(this.loadingManager),this.mtlLoader=new a(this.loadingManager),this.tgaLoader=new d(this.loadingManager),this.textureLoader=new u(this.loadingManager),this.audioLoader=new h(this.loadingManager)}resolvePath(e){return c(this.baseUrl,e)+this.urlSuffix}getModelAtPath(t){return e(this,void 0,void 0,(function*(){const e=this.resolvePath(t);switch(t.split(".").pop().toLowerCase()){case"glb":case"gltf":return(yield this.glbLoader.loadAsync(e)).scene;case"fbx":return this.fbxLoader.loadAsync(e);case"obj":return this.objLoader.loadAsync(e);default:throw new Error(`File suffix is not supperted in file ${t}`)}}))}geGltfAtPath(t){return e(this,void 0,void 0,(function*(){const e=this.resolvePath(t);return this.glbLoader.loadAsync(e)}))}getModelByAssetName(t){return e(this,void 0,void 0,(function*(){const e=(yield this.assetService.getAssets()).find((e=>e.name===t));if(null==e)throw new Error(`No model could be found with asset name ${t}`);return this.assetResourceLoader.getMesh(e)}))}getModelByAssetId(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetService.getAsset(t);if(null==e)throw new Error(`No model could be found with asset id ${t}`);return this.assetResourceLoader.getMesh(e)}))}getTextureByAssetId(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetService.getAsset(t);if(null==e)throw new Error(`No texture could be found with asset id ${t}`);return this.assetResourceLoader.getTexture(e)}))}getMaterialByAssetId(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetService.getAsset(t);if(null==e)throw new Error(`No material could be found with asset id ${t}`);return f(e,null,this.assetService,this.assetResourceLoader,this.shaders,!1)}))}getAsset(t){return e(this,void 0,void 0,(function*(){return this.assetService.getAsset(t)}))}};v=t([g(),s("design:paramtypes",[r,Object,Array])],v);export{v as AssetLoader};
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -2,9 +2,12 @@ import { Constructable } from "typedi";
2
2
  import { BaseActor } from "../actors/actor";
3
3
  import { ActorFactory } from "../actors/factory";
4
4
  import { Euler, Scene, Vector3 } from 'three';
5
+ import { Observable } from 'rxjs';
5
6
  export declare class World {
6
7
  private actorFactory;
7
8
  readonly actors: BaseActor[];
9
+ readonly actorAdded: Observable<BaseActor>;
10
+ readonly actorRemoved: Observable<BaseActor>;
8
11
  scene: Scene;
9
12
  constructor(actorFactory: ActorFactory);
10
13
  spawnActor<T extends BaseActor>(type: Constructable<T>, position?: Vector3, rotation?: Euler): Promise<T>;
@@ -1,4 +1,4 @@
1
- import{__awaiter as t,__decorate as o,__metadata as r}from"tslib";import{Service as e}from"typedi";import{ActorFactory as c}from"../actors/factory";import{ActorComponent as i}from"../../gameplay/actors/component";let s=class{constructor(t){this.actorFactory=t,this.actors=[]}spawnActor(o,r,e){return t(this,void 0,void 0,(function*(){const t=yield this.actorFactory.create(o,r,e);return this.addActor(t,r,e),t}))}addActor(t,o,r){o&&t.object.position.copy(o),r&&t.object.rotation.copy(r),this.scene.add(t.object),this.actors.push(t),n(t,(t=>t.onBeginPlay()))}removeActor(t){n(t,(t=>t.onEndPlay())),this.actors.splice(this.actors.indexOf(t),1),this.scene.remove(t.object),t.disposed.next(!0)}findActorByType(t,o){return this.actors.find((r=>r instanceof t&&(null==o||r.object.name==o)))}findActorsByType(t,o){return this.actors.filter((r=>r instanceof t&&(null==o||r.object.name==o)))}};s=o([e(),r("design:paramtypes",[c])],s);export{s as World};function n(t,o){return o(t),Object.entries(t).filter((([t,o])=>o instanceof i)).forEach((([t,r])=>{n(r,o)}))}
1
+ import{__awaiter as t,__decorate as o,__metadata as e}from"tslib";import{Service as r}from"typedi";import{ActorFactory as c}from"../actors/factory";import{ActorComponent as i}from"../../gameplay/actors/component";import{Subject as s}from"rxjs";let n=class{constructor(t){this.actorFactory=t,this.actors=[],this.actorAdded=new s,this.actorRemoved=new s}spawnActor(o,e,r){return t(this,void 0,void 0,(function*(){const t=yield this.actorFactory.create(o,e,r);return this.addActor(t,e,r),t}))}addActor(t,o,e){o&&t.object.position.copy(o),e&&t.object.rotation.copy(e),this.scene.add(t.object),this.actors.push(t),a(t,(t=>t.onBeginPlay())),this.actorAdded.next(t)}removeActor(t){a(t,(t=>t.onEndPlay())),this.actors.splice(this.actors.indexOf(t),1),this.scene.remove(t.object),t.disposed.next(!0),this.actorRemoved.next(t)}findActorByType(t,o){return this.actors.find((e=>e instanceof t&&(null==o||e.object.name==o)))}findActorsByType(t,o){return this.actors.filter((e=>e instanceof t&&(null==o||e.object.name==o)))}};n=o([r(),e("design:paramtypes",[c])],n);export{n as World};function a(t,o){return o(t),Object.entries(t).filter((([t,o])=>o instanceof i)).forEach((([t,e])=>{a(e,o)}))}
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -13,6 +13,7 @@ export declare class RenderingView {
13
13
  renderer: WebGLRenderer;
14
14
  rendererDepth: WebGLRenderer;
15
15
  private composer;
16
+ private bloomComposer;
16
17
  private outlinePass;
17
18
  scene: THREE.Scene;
18
19
  running: boolean;
@@ -52,7 +53,12 @@ export declare class RenderingView {
52
53
  addOverlayCamera(camera: Camera): void;
53
54
  clearOverlayCameras(): void;
54
55
  removeOverlayCamera(camera: Camera): void;
55
- render(): void;
56
+ private prevClearColor;
57
+ render(deltaTime?: number): void;
58
+ private bloomStoredMaterials;
59
+ private hasBloom;
60
+ private darkenNonBloomed;
61
+ private restoreMaterial;
56
62
  private initDepthUniform;
57
63
  }
58
64
  export declare function setRenderingPaused(value: boolean): void;
package/dist/rendering.js CHANGED
@@ -1,4 +1,4 @@
1
- import*as e from"three";import{Mesh as t,Matrix4 as i,ShaderMaterial as s,PerspectiveCamera as r,ShaderChunk as n}from"three";import{EffectComposer as a,VRButton as o}from"three-stdlib";import{RenderPass as h}from"three-stdlib";import{ShaderPass as d}from"three-stdlib";import{FXAAShader as l}from"three-stdlib";import{CSM as c}from"three-stdlib";import{CSMUtil as m}from"./csm";import{GammaCorrectionShader as p}from"three-stdlib";import{Reflector as u}from"three-stdlib";import{depthUniformName as g,resolutionUniformName as v,supportsDepthTextureExtension as f,nearUniformName as w,farUniformName as b}from"./shader-nodes/depth";import{elapsedTimeUniformName as x}from"./shader-nodes/time";import{OutlinePass as C}from"./utils/three/outline-pass";import R from"./utils/three/stats";import{lambertVertexShaderOverride as y}from"./rendering/shader-override";import{DepthPass as P}from"./utils/three/depth-pass";const S=new e.MeshDepthMaterial;S.depthPacking=e.RGBADepthPacking,S.blending=e.NoBlending;n.lights_pars_begin;n.lights_lambert_vertex=y;export class RenderingView{setPaused(e){this.paused=e}resizeRender(){this.previousClientWith===this.container.clientWidth&&this.previousClientHeight===this.container.clientHeight||(this.camera instanceof r&&(this.camera.aspect=this.container.clientWidth/this.container.clientHeight,this.camera.updateProjectionMatrix()),this.renderer.setPixelRatio(window.devicePixelRatio*this.resolutionScale),this.renderer.setSize(this.container.clientWidth,this.container.clientHeight),this.composer.setSize(this.container.clientWidth*this.resolutionScale,this.container.clientHeight*this.resolutionScale),this.previousClientWith=this.container.clientWidth,this.previousClientHeight=this.container.clientHeight)}constructor(t,i={}){var s;this.container=t,this.options=i,this.windowVisible=!0,this.running=!0,this.paused=!1,this.fpsCap=null,this.resolutionScale=1,this.onResize=()=>{this.resizeRender(),this.paused||this.composer.render()},this.onVisiblityChane=()=>{this.windowVisible=!document.hidden},this.isDepthTextureExtensionSupported=!1,this.onLoopCallbacks=[],this.stats=R(),this._showStats=!1,this.insetHeight=200,this.insetWidth=this.insetHeight*(16/9),this.insetOffsetY=250,this.insetMargin=10,this.maxInsetCameras=4,this.overlayCameras=new Set,window.renderer=this.renderer=new e.WebGLRenderer({antialias:!0,powerPreference:"high-performance"}),this.scene=new e.Scene,this.renderer.setPixelRatio(window.devicePixelRatio*this.resolutionScale),this.renderer.setSize(t.clientWidth,t.clientHeight),this.renderer.xr.enabled=null!==(s=this.options.enableXR)&&void 0!==s&&s,!0===this.options.enableXR&&document.body.appendChild(o.createButton(this.renderer)),this.composer=new a(this.renderer);var r=t.clientWidth/t.clientHeight;const n=new e.PerspectiveCamera(45,r,.5,500);n.layers.enable(19),this.setCamera(n),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=e.PCFSoftShadowMap,this.renderer.shadowMap.autoUpdate=!1,this.renderer.outputEncoding=e.sRGBEncoding,this.renderer.physicallyCorrectLights=!1,this.renderer.gammaFactor=1.4,m.renderingView=this,m.patchThreeAdd(),this.isDepthTextureExtensionSupported=f(this.renderer),t.replaceChildren(this.renderer.domElement),this.setupEventListeners(),this.depthRenderTarget=RenderingView.createDepthRenderTarget(this.renderer,this.container);const c=new h(this.scene,this.camera);if(this.composer.addPass(c),this.outlinePass=new C(new e.Vector2(t.clientWidth,t.clientHeight),this.scene,this.camera),!0===i.enableOutlines){this.outlinePass.edgeThickness=0,this.outlinePass.edgeGlow=0,this.outlinePass.edgeThickness=1.5,this.outlinePass.edgeStrength=5,this.outlinePass.clear=!1,this.composer.addPass(this.outlinePass);const e=new d(l);e.uniforms.resolution.value.set(1/t.clientWidth,1/t.clientHeight),this.composer.addPass(e);var u=new d(p);u.clear=!1,this.composer.addPass(u)}}setCamera(t){this.camera=t,this.composer.passes.forEach((e=>{e instanceof h?e.camera=t:e instanceof C?e.renderCamera=t:e instanceof P&&(e.camera=t)})),null==this.csm?this.csm=new c({maxFar:200,lightFar:300,cascades:5,shadowMapSize:2048,lightDirection:new e.Vector3(.5,-1,-.6).normalize(),lightIntensity:.5,camera:this.camera,parent:this.scene}):(this.csm.camera=this.camera,this.camera instanceof r&&(this.csm.maxFar=this.camera.far)),this.csm.updateFrustums()}setSelectedObjects(e){const t=new Map;for(const i of e)t.set(i.uuid,i);for(const i of e)i.traverse((e=>{e.uuid!==i.uuid&&t.has(e.uuid)&&t.delete(e.uuid)}));this.outlinePass.selectedObjects=Array.from(t.values())}static createDepthRenderTarget(t,i){var s=!!t.extensions.get("WEBGL_depth_texture");const r=new e.WebGLRenderTarget(i.clientWidth*t.getPixelRatio(),i.clientHeight*t.getPixelRatio());return r.texture.minFilter=e.NearestFilter,r.texture.magFilter=e.NearestFilter,r.texture.generateMipmaps=!1,r.stencilBuffer=!1,!0===s&&(r.depthTexture=new e.DepthTexture(128,128),r.depthTexture.type=e.UnsignedShortType,r.depthTexture.minFilter=e.NearestFilter,r.depthTexture.magFilter=e.NearestFilter),r}setupEventListeners(){window.addEventListener("resize",this.onResize),window.addEventListener("orientationchange",this.onResize),document.addEventListener("visibilitychange",this.onVisiblityChane)}stop(){this.running=!1,window.removeEventListener("resize",this.onResize),window.removeEventListener("orientationchange",this.onResize),document.removeEventListener("visibilitychange",this.onVisiblityChane),this.onLoopCallbacks=[],this.renderer.dispose(),this.depthRenderTarget.dispose(),this.csm.dispose(),this.container.replaceChildren()}onLoop(e){this.onLoopCallbacks.push(e)}removeOnLoop(e){const t=this.onLoopCallbacks.find(e);this.onLoopCallbacks.splice(t,1)}set showStats(e){this._showStats=e,this._showStats&&!this.container.contains(this.stats.dom)?this.container.appendChild(this.stats.dom):!this._showStats&&this.container.contains(this.stats.dom)&&this.container.removeChild(this.stats.dom)}get showStats(){return this._showStats}loop(s,r=!1){const n=this.stats;n.showPanel(0),this.showStats=r;performance.now();e.Ray.prototype.intersectTriangle;let a=0;const o=new i,h=new i,d=e=>{var i,r;const l=this.renderer.getContext();if(this.paused&&this.running&&l.drawingBufferHeight>1)return void setTimeout((()=>d(e)),500);this.renderer.autoClear=!1,this.renderer.clear(),this.renderer.setViewport(0,0,this.container.clientWidth,this.container.clientHeight),this.camera,n.begin();let c=(e*=.001)-a;if(a=e,o.copy(this.camera.matrixWorld),c>1){let e=c;for(;e>.05;)s(T),e-=T;s(e)}else s(c);this.onLoopCallbacks.forEach((e=>e(c))),null===(i=this.camera)||void 0===i||i.updateMatrixWorld(),h.copy(this.camera.matrixWorld),h.equals(o)||(this.renderer.shadowMap.needsUpdate=!0),this.resizeRender();const m=[],p=[];if(this.scene.traverse((i=>{var s,r,n,a,o,h;i instanceof t&&i.visible&&((null===(r=null===(s=i.material)||void 0===s?void 0:s.userData)||void 0===r?void 0:r.water)||(null===(n=i.material)||void 0===n?void 0:n.uniforms)&&null!=(null===(a=i.material)||void 0===a?void 0:a.uniforms[g]))?(i.visible=!1,m.push(i),this.initDepthUniform(i.material),i.renderOrder=100):i instanceof u&&(i.visible=!1,p.push(i)),i instanceof t&&(null===(o=i.material)||void 0===o?void 0:o.uniforms)&&null!=(null===(h=i.material)||void 0===h?void 0:h.uniforms[x])&&(i.material.uniforms[x].value=e)})),m.length>0){if(this.scene.overrideMaterial=S,this.renderer.setRenderTarget(this.depthRenderTarget),!this.paused&&null!=this.camera)try{this.renderer.clear(),this.renderer.render(this.scene,this.camera)}catch(e){console.warn(e)}this.renderer.setRenderTarget(null),this.scene.overrideMaterial=null}m.forEach((e=>e.visible=!0)),p.forEach((e=>e.visible=!0));try{!this.paused&&this.running&&(this.composer.render(c),this.renderOverlay())}catch(e){console.warn(e)}n.end(),null===(r=this.csm)||void 0===r||r.update(),this.running&&!0!==this.options.enableXR&&(this.fpsCap?setTimeout((()=>{requestAnimationFrame(d)}),1e3/this.fpsCap):requestAnimationFrame(d))};!0===this.options.enableXR?this.renderer.setAnimationLoop(d):requestAnimationFrame(d)}renderOverlay(){const e=Array.from(this.overlayCameras.values()).slice(0,this.maxInsetCameras),t=this.container.clientWidth/2,i=e.length*this.insetWidth+(e.length-1)*this.insetMargin;for(let s=0;s<e.length;s++)this.renderer.clearDepth(),this.renderer.setViewport(t-i/2+this.insetWidth*s+this.insetMargin*s,this.insetOffsetY,this.insetWidth,this.insetHeight),this.renderer.render(this.scene,e[s])}addOverlayCamera(e){this.overlayCameras.add(e)}clearOverlayCameras(){this.overlayCameras.clear()}removeOverlayCamera(e){this.overlayCameras.delete(e)}render(){this.composer.render()}initDepthUniform(e){e instanceof s&&(e.uniforms[g].value=this.isDepthTextureExtensionSupported?this.depthRenderTarget.depthTexture:this.depthRenderTarget.texture,null!=e.uniforms[v]&&e.uniforms[v].value.set(this.container.clientWidth*this.renderer.getPixelRatio(),this.container.clientHeight*this.renderer.getPixelRatio()),this.camera instanceof r&&(e.uniforms[w].value=this.camera.near,e.uniforms[b].value=this.camera.far))}}export function setRenderingPaused(e){var t,i;null!=(null===(i=null===(t=window.editor)||void 0===t?void 0:t.viewer)||void 0===i?void 0:i.renderingView)&&(window.editor.viewer.renderingView.paused=e)}const T=.05;
1
+ import*as e from"three";import{Mesh as t,Matrix4 as i,ShaderMaterial as s,Color as r,PerspectiveCamera as n,ShaderChunk as a}from"three";import{EffectComposer as o,UnrealBloomPass as h,VRButton as l}from"three-stdlib";import{RenderPass as d}from"three-stdlib";import{ShaderPass as c}from"three-stdlib";import{FXAAShader as m}from"three-stdlib";import{CSM as u}from"three-stdlib";import{CSMUtil as p}from"./csm";import{GammaCorrectionShader as v}from"three-stdlib";import{Reflector as g}from"three-stdlib";import{depthUniformName as f,resolutionUniformName as w,supportsDepthTextureExtension as b,nearUniformName as x,farUniformName as C}from"./shader-nodes/depth";import{elapsedTimeUniformName as R}from"./shader-nodes/time";import{OutlinePass as S}from"./utils/three/outline-pass";import T from"./utils/three/stats";import{findFirstVisibleObject as y}from"./utils/three/traverse";import{lambertVertexShaderOverride as P}from"./rendering/shader-override";import{DepthPass as M}from"./utils/three/depth-pass";(new e.Layers).set(9);const W=new e.MeshBasicMaterial({color:"black"}),L=new e.MeshDepthMaterial;L.depthPacking=e.RGBADepthPacking,L.blending=e.NoBlending;a.lights_pars_begin;a.lights_lambert_vertex=P;export class RenderingView{setPaused(e){this.paused=e}resizeRender(){this.previousClientWith===this.container.clientWidth&&this.previousClientHeight===this.container.clientHeight||(this.camera instanceof n&&(this.camera.aspect=this.container.clientWidth/this.container.clientHeight,this.camera.updateProjectionMatrix()),this.renderer.setPixelRatio(window.devicePixelRatio*this.resolutionScale),this.renderer.setSize(this.container.clientWidth,this.container.clientHeight),this.composer.setSize(this.container.clientWidth*this.resolutionScale,this.container.clientHeight*this.resolutionScale),this.previousClientWith=this.container.clientWidth,this.previousClientHeight=this.container.clientHeight)}constructor(t,i={}){var s;this.container=t,this.options=i,this.windowVisible=!0,this.running=!0,this.paused=!1,this.fpsCap=null,this.resolutionScale=1,this.onResize=()=>{this.resizeRender(),this.paused||this.render()},this.onVisiblityChane=()=>{this.windowVisible=!document.hidden},this.isDepthTextureExtensionSupported=!1,this.onLoopCallbacks=[],this.stats=T(),this._showStats=!1,this.insetHeight=200,this.insetWidth=this.insetHeight*(16/9),this.insetOffsetY=250,this.insetMargin=10,this.maxInsetCameras=4,this.overlayCameras=new Set,this.prevClearColor=new r,this.bloomStoredMaterials={},window.renderer=this.renderer=new e.WebGLRenderer({antialias:!0,powerPreference:"high-performance"}),this.scene=new e.Scene,this.renderer.setPixelRatio(window.devicePixelRatio*this.resolutionScale),this.renderer.setSize(t.clientWidth,t.clientHeight),this.renderer.xr.enabled=null!==(s=this.options.enableXR)&&void 0!==s&&s,!0===this.options.enableXR&&document.body.appendChild(l.createButton(this.renderer)),this.composer=new o(this.renderer);var n=t.clientWidth/t.clientHeight;const a=new e.PerspectiveCamera(45,n,.5,500);a.layers.enable(19),this.setCamera(a),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=e.PCFSoftShadowMap,this.renderer.shadowMap.autoUpdate=!1,this.renderer.outputEncoding=e.sRGBEncoding,this.renderer.physicallyCorrectLights=!1,this.renderer.gammaFactor=1.4,p.renderingView=this,p.patchThreeAdd(),this.isDepthTextureExtensionSupported=b(this.renderer),t.replaceChildren(this.renderer.domElement),this.setupEventListeners(),this.depthRenderTarget=RenderingView.createDepthRenderTarget(this.renderer,this.container);const u=new d(this.scene,this.camera);this.composer.addPass(u);const g=new h(new e.Vector2(t.clientWidth,t.clientHeight),1.5,.4,.85);g.threshold=0,g.strength=.9,g.radius=1;const f=new o(this.renderer);f.renderToScreen=!1,f.addPass(u),f.addPass(g),this.bloomComposer=f;const w=new c(new e.ShaderMaterial({uniforms:{baseTexture:{value:null},bloomTexture:{value:f.renderTarget2.texture}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"\n uniform sampler2D baseTexture;\n uniform sampler2D bloomTexture;\n varying vec2 vUv;\n void main() {\n gl_FragColor = ( texture2D( baseTexture, vUv ) + vec4( 1.0 ) * texture2D( bloomTexture, vUv ) );\n }",defines:{}}),"baseTexture");if(w.needsSwap=!0,this.composer.addPass(w),this.outlinePass=new S(new e.Vector2(t.clientWidth,t.clientHeight),this.scene,this.camera),!0===i.enableOutlines){this.outlinePass.edgeThickness=0,this.outlinePass.edgeGlow=0,this.outlinePass.edgeThickness=1.5,this.outlinePass.edgeStrength=5,this.outlinePass.clear=!1,this.composer.addPass(this.outlinePass);const e=new c(m);e.uniforms.resolution.value.set(1/t.clientWidth,1/t.clientHeight),this.composer.addPass(e)}var x=new c(v);x.clear=!1,this.composer.addPass(x)}setCamera(t){this.camera=t,this.composer.passes.forEach((e=>{e instanceof d?e.camera=t:e instanceof S?e.renderCamera=t:e instanceof M&&(e.camera=t)})),null==this.csm?this.csm=new u({maxFar:200,lightFar:300,cascades:5,shadowMapSize:2048,lightDirection:new e.Vector3(.5,-1,-.6).normalize(),lightIntensity:.5,camera:this.camera,parent:this.scene}):(this.csm.camera=this.camera,this.camera instanceof n&&(this.csm.maxFar=this.camera.far)),this.csm.updateFrustums()}setSelectedObjects(e){const t=new Map;for(const i of e)t.set(i.uuid,i);for(const i of e)i.traverse((e=>{e.uuid!==i.uuid&&t.has(e.uuid)&&t.delete(e.uuid)}));this.outlinePass.selectedObjects=Array.from(t.values())}static createDepthRenderTarget(t,i){var s=!!t.extensions.get("WEBGL_depth_texture");const r=new e.WebGLRenderTarget(i.clientWidth*t.getPixelRatio(),i.clientHeight*t.getPixelRatio());return r.texture.minFilter=e.NearestFilter,r.texture.magFilter=e.NearestFilter,r.texture.generateMipmaps=!1,r.stencilBuffer=!1,!0===s&&(r.depthTexture=new e.DepthTexture(128,128),r.depthTexture.type=e.UnsignedShortType,r.depthTexture.minFilter=e.NearestFilter,r.depthTexture.magFilter=e.NearestFilter),r}setupEventListeners(){window.addEventListener("resize",this.onResize),window.addEventListener("orientationchange",this.onResize),document.addEventListener("visibilitychange",this.onVisiblityChane)}stop(){this.running=!1,window.removeEventListener("resize",this.onResize),window.removeEventListener("orientationchange",this.onResize),document.removeEventListener("visibilitychange",this.onVisiblityChane),this.onLoopCallbacks=[],this.renderer.dispose(),this.depthRenderTarget.dispose(),this.csm.dispose(),this.container.replaceChildren()}onLoop(e){this.onLoopCallbacks.push(e)}removeOnLoop(e){const t=this.onLoopCallbacks.find(e);this.onLoopCallbacks.splice(t,1)}set showStats(e){this._showStats=e,this._showStats&&!this.container.contains(this.stats.dom)?this.container.appendChild(this.stats.dom):!this._showStats&&this.container.contains(this.stats.dom)&&this.container.removeChild(this.stats.dom)}get showStats(){return this._showStats}loop(s,r=!1){const n=this.stats;n.showPanel(0),this.showStats=r;performance.now();e.Ray.prototype.intersectTriangle;let a=0;const o=new i,h=new i,l=e=>{var i,r;const d=this.renderer.getContext();if(this.paused&&this.running&&d.drawingBufferHeight>1)return void setTimeout((()=>l(e)),500);this.renderer.autoClear=!1,this.renderer.clear(),this.renderer.setViewport(0,0,this.container.clientWidth,this.container.clientHeight),this.camera,n.begin();let c=(e*=.001)-a;if(a=e,o.copy(this.camera.matrixWorld),c>1){let e=c;for(;e>.05;)s(D),e-=D;s(e)}else s(c);this.onLoopCallbacks.forEach((e=>e(c))),null===(i=this.camera)||void 0===i||i.updateMatrixWorld(),h.copy(this.camera.matrixWorld),h.equals(o)||(this.renderer.shadowMap.needsUpdate=!0),this.resizeRender();const m=[],u=[];if(this.scene.traverse((i=>{var s,r,n,a,o,h;i instanceof t&&i.visible&&((null===(r=null===(s=i.material)||void 0===s?void 0:s.userData)||void 0===r?void 0:r.water)||(null===(n=i.material)||void 0===n?void 0:n.uniforms)&&null!=(null===(a=i.material)||void 0===a?void 0:a.uniforms[f]))?(i.visible=!1,m.push(i),this.initDepthUniform(i.material),i.renderOrder=100):i instanceof g&&(i.visible=!1,u.push(i)),i instanceof t&&(null===(o=i.material)||void 0===o?void 0:o.uniforms)&&null!=(null===(h=i.material)||void 0===h?void 0:h.uniforms[R])&&(i.material.uniforms[R].value=e)})),m.length>0){if(this.scene.overrideMaterial=L,this.renderer.setRenderTarget(this.depthRenderTarget),!this.paused&&null!=this.camera)try{this.renderer.clear(),this.renderer.render(this.scene,this.camera)}catch(e){console.warn(e)}this.renderer.setRenderTarget(null),this.scene.overrideMaterial=null}m.forEach((e=>e.visible=!0)),u.forEach((e=>e.visible=!0));try{!this.paused&&this.running&&(this.render(c),this.renderOverlay())}catch(e){console.warn(e)}n.end(),null===(r=this.csm)||void 0===r||r.update(),this.running&&!0!==this.options.enableXR&&(this.fpsCap?setTimeout((()=>{requestAnimationFrame(l)}),1e3/this.fpsCap):requestAnimationFrame(l))};!0===this.options.enableXR?this.renderer.setAnimationLoop(l):requestAnimationFrame(l)}renderOverlay(){const e=Array.from(this.overlayCameras.values()).slice(0,this.maxInsetCameras),t=this.container.clientWidth/2,i=e.length*this.insetWidth+(e.length-1)*this.insetMargin;for(let s=0;s<e.length;s++)this.renderer.clearDepth(),this.renderer.setViewport(t-i/2+this.insetWidth*s+this.insetMargin*s,this.insetOffsetY,this.insetWidth,this.insetHeight),this.renderer.render(this.scene,e[s])}addOverlayCamera(e){this.overlayCameras.add(e)}clearOverlayCameras(){this.overlayCameras.clear()}removeOverlayCamera(e){this.overlayCameras.delete(e)}render(e){if(this.hasBloom()){const e=this.scene.fog;this.scene.fog=null;const t=this.renderer.getClearColor(this.prevClearColor);this.renderer.setClearColor(0),this.scene.traverseVisible((e=>this.darkenNonBloomed(e))),this.bloomComposer.render(),this.scene.traverse((e=>this.restoreMaterial(e))),this.renderer.setClearColor(t),this.scene.fog=e}this.composer.render(e)}hasBloom(){return null!=y(this.scene,(e=>{var i,s;return e instanceof t&&!0===(null===(s=null===(i=e.material)||void 0===i?void 0:i.userData)||void 0===s?void 0:s.hasBloom)}))}darkenNonBloomed(e){e.isMesh&&e.visible&&!0!==e.material.userData.hasBloom&&(this.bloomStoredMaterials[e.uuid]=e.material,!0!==e.material.transparent?e.material=W:e.visible=!1)}restoreMaterial(e){this.bloomStoredMaterials[e.uuid]&&(e.material=this.bloomStoredMaterials[e.uuid],delete this.bloomStoredMaterials[e.uuid],e.visible=!0)}initDepthUniform(e){e instanceof s&&(e.uniforms[f].value=this.isDepthTextureExtensionSupported?this.depthRenderTarget.depthTexture:this.depthRenderTarget.texture,null!=e.uniforms[w]&&e.uniforms[w].value.set(this.container.clientWidth*this.renderer.getPixelRatio(),this.container.clientHeight*this.renderer.getPixelRatio()),this.camera instanceof n&&(e.uniforms[x].value=this.camera.near,e.uniforms[C].value=this.camera.far))}}export function setRenderingPaused(e){var t,i;null!=(null===(i=null===(t=window.editor)||void 0===t?void 0:t.viewer)||void 0===i?void 0:i.renderingView)&&(window.editor.viewer.renderingView.paused=e)}const D=.05;
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -1,4 +1,4 @@
1
- import{__awaiter as e}from"tslib";import{Subject as t}from"rxjs";import*as i from"three";import{BoxGeometry as r,Color as a,Euler as s,Fog as o,FogExp2 as n,Group as l,Material as c,Mesh as d,MeshLambertMaterial as h,MeshPhongMaterial as u,MeshStandardMaterial as m,Object3D as p,PointLight as f,Quaternion as v,SphereGeometry as y,Texture as g,Vector2 as w,Vector3 as A,Vector4 as S}from"three";import b,{SpriteRenderer as M}from"three-nebula";import{bool as x,BooleanNode as I,float as P,FloatNode as D,NodeShaderMaterial as j,rgb as V,RgbNode as E,Texture2dLookupNode as N,textureSampler2d as C,vec2 as O,Vec2Node as F,vec3 as k,Vec3Node as z,vec4 as B}from"three-shader-graph";import _ from"../gameplay/actors/builtin";import{extractShaderParameters as T}from"../shader/parameter";import{groupBy as $,ArrayMap as L}from"../utils/collections";import{filterChildrenShallow as R,filterSceneShallow as U}from"../utils/three/traverse";import{AssetMeshInstance as H}from"./asset-resource-loader";import{BoxCollisionShape as W,PhysicalShapeMesh as G}from"./collision/collision-shape";import{isCollisionMesh as J}from"./collision/collision-shape-import";import{initLandscape as X}from"./landscape/landscape";import{LandscapeManager as Y}from"./landscape/landscape-manager";import{SectionGrid as q,smoothNormalsCrossMeshes as Z}from"./landscape/utils";import{createGrassMaterial as K}from"./materials/grass";import{createGrassFoliageMaterial as Q}from"./materials/grass-foliage";import{getMaterialAttribute as ee}from"./materials/utils/material-painting";import{createWaterMaterial as te}from"./materials/water";import{SerializedParamType as ie}from"./model";import{Matrix4 as re}from"three";import{BaseActor as ae}from"../gameplay/actors/actor";import{Sampler2DNode as se}from"../shader-nodes";import{StandardShader as oe}from"../shader/builtin/standard-shader";import{LambertShader as ne}from"../shader/builtin/lambert-shader";import{ShapeLibrary as le,ShapeLibraryKeys as ce}from"./objects/shapes";import{ambientLightName as de,createSky as he,defaultSkyMaterial as ue}from"./sky";import{ActorComponent as me,withInjectionContext as pe}from"../gameplay";import{iterateMaterials as fe}from"../utils/materials";import{VfxActor as ve}from"../effects/vfx/vfx-actor";import{VisualEffect as ye}from"../effects/vfx/vfx-param";const ge={};export const shapeDefaultColor="#aaaaaa";export class SceneMaterializerLoader{constructor(e,t,i){this.dataProvider=e,this.assetsService=t,this.assetManagerService=i}get(t,i){return new SceneMaterializer(t,this.dataProvider,this.assetsService,this.assetManagerService,i,[],[],{create:()=>null,initActor:()=>e(this,void 0,void 0,(function*(){}))})}}export class SceneMaterializer{constructor(i,r,a,s,o,n,l,c){this.scene=i,this.dataProvider=r,this.assetsService=a,this.assetManagerService=s,this.renderingView=o,this.shaders=n,this.actorTypes=l,this.actorProvider=c,this.objectMap=new Map,this.sceneObjectMap=new Map,this.components=[],this.landscapeManagers=[],this.materializedActors=new Map,this.inEditor=!0,this.updated$=new t,this.removed$=new t,this.error$=new t,this.editorActorParamSnapshot=new Map,this._canBeInstancedCache=new Map,this._originalMaterials=new Map,this.originalFog=null,r.onUpdate((e=>this.update(e))),r.onRemove((e=>this.remove(e))),this.updateSubscription=a.onUpdate.subscribe((t=>e(this,void 0,void 0,(function*(){"material"==t.type?((yield this.assetsService.getAssets()).filter((e=>{var i;return(null!==(i=e.materialAssignments)&&void 0!==i?i:[]).some((e=>e.materialId===t.id))})).forEach((e=>{const t=this.findByAssetId(e.id);e.materialAssignments.forEach((e=>{t.forEach((t=>{const i=t.userData.src.materialAssignments;null!=i&&i.some((t=>t.color===e.color))||this.applyMaterial(t,e)}))}))})),U(this.scene,(e=>{var i;return null!=e.userData.src&&(null!==(i=e.userData.src.materialAssignments)&&void 0!==i?i:[]).some((e=>e.materialId===t.id))}),(e=>null!=e.userData.src)).forEach((t=>e(this,void 0,void 0,(function*(){this.deleteSceneObject(t.userData.src),this.materialize(t.userData.src)}))))):"mesh"==t.type?this.findByAssetId(t.id).forEach((e=>{je(e.userData.src.materialAssignments,t.materialAssignments).forEach((t=>{this.applyMaterial(e,t)}))})):"prefab"===t.type&&this.findByAssetId(t.id).forEach((e=>{const t=e.userData.src;this.remove(t),this.materializeAndInitActor(t)}))}))))}get actorInstances(){return Array.from(this.materializedActors.values())}prefetchAssets(){return e(this,void 0,void 0,(function*(){const e=Array.from(new Set(this.dataProvider.getObjects().filter((e=>null!=e.assetId&&"asset_mesh"==e.type)).filter((e=>e.assetId))));yield Promise.all(e.map((e=>this.assetsService.getAsset(e.assetId).then((e=>e&&this.assetManagerService.getMesh(e))))))}))}init(){return e(this,void 0,void 0,(function*(){this.preInit(),Ae.clear(),yield this.prefetchAssets(),yield Promise.all(this.dataProvider.getObjects().map((e=>this.materialize(e)))),yield this.initActorsPostInit()}))}initActorsPostInit(t=this.actorInstances){const i=t.map((t=>e(this,void 0,void 0,(function*(){var e,i,r,a,s;const o=t.object.userData.src;if("vfx"===o.type)return Promise.resolve();const n=yield this.assetsService.getAsset(o.assetId),l=Object.assign(Object.assign({},null!==(i=null===(e=null==n?void 0:n.actor)||void 0===e?void 0:e.params)&&void 0!==i?i:{}),null!==(a=null===(r=o.actor)||void 0===r?void 0:r.params)&&void 0!==a?a:{});this.removeVfxChildActors(t);for(const e of null!==(s=o.actor.innerParams)&&void 0!==s?s:[])yield this.applyActorComponentParams(t,e.path.slice(),e.params);const c=yield Me(l,t.constructor,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,this.shaders,this.actorProvider);Object.assign(t,c),this.addVfxChildActors(t);try{return yield this.actorProvider.initActor(t)}catch(e){console.error(`Failed to initiate actor (name="${o.name}", id=${o.id})`,e)}}))));return Promise.all(i)}addVfxChildActors(e,t=e){for(const i of Object.keys(t))t[i]instanceof ye?null!=t[i].actor&&(console.log("add actor to world",t[i].actor),e.object.add(t[i].actor.object)):t[i]instanceof me&&this.addVfxChildActors(e,t[i])}removeVfxChildActors(e,t=e){for(const i of Object.keys(t))if(t[i]instanceof ye){if(null!=t[i].actor){t[i].actor.onEndPlay(),console.log("remve actor from world",t[i].actor),e.object.remove(t[i].actor.object)}}else t[i]instanceof me&&this.removeVfxChildActors(e,t[i])}applyActorComponentParams(t,i,r){return e(this,void 0,void 0,(function*(){const e=i.length,a=i.shift();if(0==e){const e=yield Me(r,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,this.shaders);for(const[i,r]of Object.entries(e))null!=r&&(t[i]=r)}else null!=t[a]&&(yield this.applyActorComponentParams(t[a],i,r))}))}canAssetBeInstanced(t){return e(this,void 0,void 0,(function*(){if(!this._canBeInstancedCache.has(t.assetId)){const e=yield this.createFromAsset(t);if(null==e)return!1;const i=[];e.traverse((e=>{!J(e)&&e.isMesh&&i.push(e)}));const r=1==i.length&&0==i[0].children.length,a=!0;this._canBeInstancedCache.set(t.assetId,r&&a)}return this._canBeInstancedCache.get(t.assetId)}))}preInit(){var e;null===(e=this.renderingView)||void 0===e||e.onLoop((()=>{var e;return null===(e=this.sky)||void 0===e?void 0:e.position.copy(this.renderingView.camera.position)}))}initWithInstancing(){return e(this,void 0,void 0,(function*(){this.preInit();const t=new L;for(const i of this.dataProvider.getObjects())yield De(i,((i,r,a)=>e(this,void 0,void 0,(function*(){var e,s;const o="asset_mesh"==i.type&&(yield this.canAssetBeInstanced(i))?i.assetId+JSON.stringify(null!==(e=i.materialAssignments)&&void 0!==e?e:[]):"other";"other"!==o&&r&&(null===(s=r.children)||void 0===s?void 0:s.length)>0&&r.children.splice(r.children.findIndex((e=>e.id===i.id)),1),"other"===o&&r||t.push(o,Object.assign(Object.assign({},i),{parentTransform:a}))}))));for(const[e,i]of t.entries())if("other"!==e&&i.length>0){const e=yield this.createFromAsset(i[0]);if(null==e)continue;const t=yield this.createInstancedMesh(i,e),r=new H;r.add(t),r.userData.src=i[0],e instanceof H&&(r.collisionShapes=e.collisionShapes),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r)}else yield Promise.all(i.map((e=>this.materialize(e))));yield this.initActorsPostInit()}))}createInstancedMesh(t,r){var a,o;return e(this,void 0,void 0,(function*(){const e=r.children.filter((e=>!J(e)))[0],n=yield this.assetsService.getAsset(t[0].assetId);yield this.applyMaterials(r,je(t[0].materialAssignments,n.materialAssignments)),e.updateMatrix();const l=e.geometry.clone().applyMatrix4(e.matrix),c=new i.InstancedMesh(l,e.material.clone(),t.length);c.material.side=i.FrontSide;for(let e=0;e<t.length;e++){const r=(new i.Matrix4).compose((new A).fromArray(t[e].position),(new v).setFromEuler((new s).fromArray(t[e].rotation)),(new A).fromArray(t[e].scale)),a=(new re).copy(t[e].parentTransform).multiply(r);c.setMatrixAt(e,a)}return c.castShadow=null===(a=n.castShadow)||void 0===a||a,c.receiveShadow=null===(o=n.receiveShadow)||void 0===o||o,c}))}remove(e){if(console.log("Remove scene object",e),"global_fog"==e.type)return void(this.scene.fog=this.originalFog);if("actor"==e.type){const t=this.materializedActors.get(e.id);null!=t&&(t.disposed.next(!0),t.onEndPlay(),this.removeVfxChildActors(t))}const t=this.sceneObjectMap.get(e.id);null==t||t.parent.remove(t),this.sceneObjectMap.delete(e.id),this.components.filter((t=>{var i;return(null===(i=t.object.userData.src)||void 0===i?void 0:i.id)===e.id})).forEach((e=>this.components.splice(this.components.indexOf(e,1)))),this.landscapeManagers.filter((t=>t.source.id===e.id)).forEach((e=>{e.clear(),e.stop(),this.landscapeManagers.splice(this.landscapeManagers.indexOf(e,1))})),this.removed$.next({object:t,source:e})}deleteSceneObject(e){const t=this.sceneObjectMap.get(e.id);if(this.scene.remove(t),"landscape"==e.type){const t=this.landscapeManagers.findIndex((t=>t.source.id===e.id));if(t>-1){const e=this.landscapeManagers.splice(t,1)[0];e.clear(),e.stop()}}}findByAssetId(e){return U(this.scene,(t=>{var i;return(null===(i=t.userData.src)||void 0===i?void 0:i.assetId)==e}),(e=>null!=e.userData.src))}applyMaterials(e,t){return null==t?Promise.resolve([]):Promise.all(t.filter((e=>"null"!==e.materialId)).map((t=>this.applyMaterial(e,t))))}applyMaterial(t,i){const r=[];return t.traverse((t=>e(this,void 0,void 0,(function*(){if(t instanceof d||t.isMesh)for(const e of fe(t.material))e.hasOwnProperty("color")&&r.push(t)})))),Promise.all(r.map((t=>e(this,void 0,void 0,(function*(){var e,r,a,s;if(t.material instanceof Array)for(let a=0;a<t.material.length;a++){const s=t.material[a];if(null==s.color)continue;const o="#"+s.color.getHexString(),n=s.name;if(o===i.color&&(s.name===i.name||null==i.name)||t.userData["originalColor_"+a]===i.color&&t.userData["originalMaterialName_"+a]===i.name){const s=yield this.assetsService.getAsset(i.materialId),l=t.material[a];s&&(t.material[a]=yield materialFromAsset(s,this.renderingView,this.assetsService,this.assetManagerService,this.shaders),t.userData["originalColor_"+a]=null!==(e=t.userData["originalColor_"+a])&&void 0!==e?e:o,t.userData["originalMaterialName_"+a]=null!==(r=t.userData["originalMaterialName_"+a])&&void 0!==r?r:n,this.inEditor&&this._originalMaterials.set(t.id+"#"+a,l))}}else{const e="#"+t.material.color.getHexString(),r=t.material.name;if(e===i.color&&(t.material.name===i.name||null==i.name)||t.userData.originalColor===i.color&&t.userData.originalName===i.name){const o=yield this.assetsService.getAsset(i.materialId),n=t.material;o&&(t.material=yield materialFromAsset(o,this.renderingView,this.assetsService,this.assetManagerService,this.shaders),t.userData.originalColor=null!==(a=t.userData.originalColor)&&void 0!==a?a:e,t.userData.originalMaterialName=null!==(s=t.userData.originalMaterialName)&&void 0!==s?s:r,this.inEditor&&this._originalMaterials.set(t.id,n))}}})))))}unapplyMaterials(t){t.traverse((t=>e(this,void 0,void 0,(function*(){var e,i;if(t instanceof d)if(t.material instanceof Array)for(let i=0;i<t.material.length;i++)t.material[i]=null!==(e=this._originalMaterials.get(t.id+"#"+i))&&void 0!==e?e:t.material[i];else t.material=null!==(i=this._originalMaterials.get(t.id))&&void 0!==i?i:t.material}))))}updateActors(t){this.actorTypes=t;const i=new Set(Object.values(_));U(this.scene,(e=>{var t,r;return(null===(t=e.userData.src)||void 0===t?void 0:t.id)&&"actor"===e.userData.src.type&&this.materializedActors.has(null===(r=e.userData.src)||void 0===r?void 0:r.id)&&!i.has(e.userData.src.actor.type)})).forEach((t=>e(this,void 0,void 0,(function*(){this.remove(t.userData.src),yield this.materializeAndInitActor(t.userData.src)}))))}updateShaders(e){this.shaders=e;for(const[e,t]of Ae.entries())t.userData.customShaderName&&Ae.delete(e);this.landscapeManagers.forEach((t=>t.updateShaders(e))),U(this.scene,(e=>!0)).forEach((e=>{e.traverse((e=>{var t,i;if(e instanceof d){if(null!=(null===(t=e.material.userData)||void 0===t?void 0:t.customShaderName)){const t=null===(i=function(e,t){if(t(e))return e;let i;return e.traverseAncestors((e=>{null==i&&t(e)&&(i=e)})),i}(e,(e=>{var t;return null!=(null===(t=e.userData.src)||void 0===t?void 0:t.id)})))||void 0===i?void 0:i.userData.src;null!=t&&this.update(t)}}}))}))}update(t){return e(this,void 0,void 0,(function*(){if("sky"===t.type&&null!=this.sky&&null!=this.sky.parent)return void this.updateSky(t);const e=this.sceneObjectMap.get(t.id);if(e){const r=this.findParent(t);if(null!=r&&r.uuid!=e.uuid?r.attach(e):console.error("Parent is wrong"),"prefab"!==t.type){this.unapplyMaterials(e);this.inEditor&&t.hidden&&!1?e.traverse((e=>{e instanceof d&&(e.material.wireframe=!0)})):e.traverse((e=>{e instanceof d&&(e.material.wireframe=!1)}))}if("asset_mesh"===t.type){const i=yield this.assetsService.getAsset(t.assetId);je(t.materialAssignments,i.materialAssignments).forEach((t=>this.applyMaterial(e,t)))}else"shape_mesh"===t.type&&this.applyMaterials(e,t.materialAssignments);let s=!1;if(e.traverseAncestors((e=>{"_hology_transform_group"===e.name&&(s=!0)})),s||(e.position.fromArray(t.position),e.scale.fromArray(t.scale),e.rotation.fromArray(t.rotation)),this.applyVertexMaterials(t,e),"light"==t.type)if("point"==t.light.type){const i=e;i.color=new a(t.light.point.color),i.intensity=t.light.point.intensity,i.decay=t.light.point.decay,i.castShadow=t.light.point.castShadow,i.distance=Math.max(t.light.point.distance,0)}else"directional"===t.light.type?this.applyDirectionalLight(t.light.directional):"ambient"===t.light.type&&this.applyDirectionalAmbientLight(e,t.light.ambient);else if("landscape"===t.shape)this.applyHeightMaps(e,t.landscape.heightMaps),this.inEditor&&this.landscapeManagers.filter((e=>e.source.id===t.id)).forEach((e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,(e=>!0))));else if("global_fog"===t.type){const e=(this.scene.fog instanceof n?"density":"linear")!==t.fog.type;this.scene.fog=Ie(t.fog),e&&(i=this.scene).traverse((e=>{if(e instanceof d){const t=e.material;t instanceof j&&(i.fog instanceof o?(t.uniforms.fogFar.value=i.fog.far,t.uniforms.fogNear.value=i.fog.near):i.fog instanceof n&&(t.uniforms.density={value:i.fog.density}),t.needsUpdate=!0,t.uniformsNeedUpdate=!0)}})),this.fixFogColor()}else if("actor"===t.type){if(this.materializedActors.has(t.id)){const e=this.editorActorParamSnapshot.get(t.id);null!=e&&e===JSON.stringify(t.actor)||(console.log("Rematerializing actor because parameters changed"),this.remove(t),yield this.materializeAndInitActor(t))}}else if("shape_mesh"===t.type){const i=yield this.createMeshByShape(t.shape,e.material,t.shapeParams);e instanceof G&&(e.geometry=i.geometry,e.collisionShape=i.collisionShape)}("asset_mesh"===t.type||"shape_mesh"===t.type&&"landscape"!==t.shape)&&we(e,t.castShadow,t.receiveShadow),t.name&&t.name.length>0&&(e.name=t.name),this.updated$.next({object:e,source:t})}else{const e=yield this.materializeAndInitActor(t);this.updated$.next({object:e,source:t})}var i}))}materializeAndInitActor(t,i=this.findParent(t)){return e(this,void 0,void 0,(function*(){const r=yield this.materialize(t,i);return De(t,(t=>e(this,void 0,void 0,(function*(){if("actor"===t.type){const e=this.materializedActors.get(t.id);null!=e?yield this.initActorsPostInit([e]):console.error(`Something went wrong when creating actor ${t.id}`)}})))),r}))}findParent(e){const t=this.dataProvider.getObjects().flatMap((t=>t.id===e.id?null:R(t,(t=>{var i;return null===(i=t.children)||void 0===i?void 0:i.some((t=>t.id===e.id))}),(()=>!0))))[0];return null==t?this.scene:null!=t?U(this.scene,(e=>{var i,r;return(null===(r=null===(i=e.userData)||void 0===i?void 0:i.src)||void 0===r?void 0:r.id)===t.id}),(e=>{var t;return null!=(null===(t=e.userData)||void 0===t?void 0:t.src)}))[0]:void 0}fixFogColor(){!0===this.renderingView.options.enableOutlines&&(this.scene.fog.color=new a(this.scene.fog.color).convertSRGBToLinear())}findMeshWithGeometry(e){let t;return e.traverse((e=>{e instanceof d&&e.geometry&&(t=e)})),t}applyVertexMaterials(e,t){if(null==e.vertexMaterials||0===e.vertexMaterials.length)return;const i=$(e.vertexMaterials,(e=>e.m));t.traverse((e=>{if(e instanceof d){const t=ee(e,!1);if(null!=t){for(let e=0;e<t.array.length;e++)t.setX(e,0);t.needsUpdate=!0}}}));const r=new Set;for(const[e,a]of i.entries()){const i=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let s=!1;if(null==i)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=ee(i,!0);for(let e=0;e<o.array.length;e++)o.setX(e,0);for(const e of a)o.setX(e.i,e.w[0]),o.setY(e.i,e.w[1]),o.setZ(e.i,e.w[2]),s=!0;s&&r.add(e)}this.inEditor&&this.landscapeManagers.filter((t=>t.source.id===e.id)).forEach((e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,(e=>r.has(e.name)))))}materialize(t,i,a=!1){var s,o,n,c;return e(this,void 0,void 0,(function*(){let e;switch(t.type){case"asset_mesh":e=yield this.createFromAsset(t);break;case"shape_mesh":e=yield this.createFromShape(t);break;case"light":e=yield this.createLight(t);break;case"particles":e=yield this.createParticleSystem(t),t.collisionDetection=!1;break;case"global_fog":this.scene.fog=Ie(t.fog),this.fixFogColor(),e=new l;break;case"sky":this.sky=he(),this.updateSky(t),e=this.sky;break;case"actor":e=yield this.createFromActor(t);break;case"group":e=new l;break;case"prefab":e=yield this.createFromPrefabAsset(t);break;case"vfx":e=yield this.createFromVfx(t);break;default:if(this.inEditor)throw new Error("unknown type "+t.type);console.warn(`Failed to materialize object. Unknown type '${t.type}'. This might be because the hology/core library is not compatible with the editor version.`)}if(null!=e){if(t.name&&t.name.length>0&&(e.name=t.name),e.position.fromArray(t.position),e.scale.fromArray(t.scale),e.rotation.fromArray(t.rotation),a||(e.userData.src=t),!this.inEditor){const i=null!==(s=t.components)&&void 0!==s?s:[],r=null!=t.assetId&&null!==(n=null===(o=yield this.assetsService.getAsset(t.assetId))||void 0===o?void 0:o.components)&&void 0!==n?n:[];i.push(...r),i.length>0?e.userData.componentRefs=yield Promise.all(i.map(((i,r)=>this.createComponent(e,t,i,r)))):"asset_mesh"==t.type&&function(e){e.traverse((e=>{e.matrixAutoUpdate=!1,e.matrixWorldNeedsUpdate=!1}));const t=e.updateMatrixWorld;e.updateMatrixWorld=function(){t.apply(e),e.updateMatrixWorld=function(){}}}(e)}if(this.inEditor){let t=null;e instanceof G&&(t=function(e){if(e instanceof W)return new d(new r(...e.offset.toArray()),Pe);return null}(e.collisionShape)),null!=t&&(t.layers.disable(0),t.layers.enable(18),t.scale.multiplyScalar(1.1),e.add(t))}return this.objectMap.set(e.uuid,t),this.sceneObjectMap.set(t.id,e),null==i?this.scene.add(e):null==i||i.add(e),null!=t.children&&(yield Promise.all(null===(c=t.children)||void 0===c?void 0:c.map((t=>this.materialize(t,e,a))))),e}}))}updateSky(t){var r;return e(this,void 0,void 0,(function*(){if(null==(null===(r=null==t?void 0:t.sky)||void 0===r?void 0:r.materialId))return void(this.sky.material=ue);const e=yield this.assetsService.getAsset(t.sky.materialId),a=yield materialFromAsset(e,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1);a.side=i.BackSide,null!=this.sky?this.sky.material=a:console.warn("No sky has been created")}))}createComponent(t,i,r,a){return e(this,void 0,void 0,(function*(){const e=new ge[r.path+"/"+r.className],s=i.id+a;e.id=s,e.object=t;for(const t of r.params)null!=t.value&&(e[t.name]=t.value);return this.components.push(e),s}))}createFromActor(t){var i,r,a;return e(this,void 0,void 0,(function*(){const e=null!==(r=null===(i=this.actorTypes.find((e=>{var i;return e.name===(null===(i=t.actor)||void 0===i?void 0:i.type)})))||void 0===i?void 0:i.type)&&void 0!==r?r:_[null===(a=t.actor)||void 0===a?void 0:a.type];if(null==e)return null;this.inEditor&&this.editorActorParamSnapshot.set(t.id,JSON.stringify(t.actor));const o=yield this.actorProvider.create(e,(new A).fromArray(t.position),(new s).fromArray(t.rotation),!0);return this.materializedActors.set(t.id,o),null==o?void 0:o.object}))}createFromVfx(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId);null==e&&console.error("Could not find asset",t);const i=ve,r=yield this.actorProvider.create(i,(new A).fromArray(t.position),(new s).fromArray(t.rotation),!1);return yield r.fromAsset(e),r.play(),this.materializedActors.set(t.id,r),null==r?void 0:r.object}))}cleanup(){this.materializedActors.clear()}createFromShape(t){var i,r,s;return e(this,void 0,void 0,(function*(){const e=this.inEditor&&t.hidden;let o;if("landscape"==t.shape)o=this.createLandscape(t);else{let s=new m({name:"Default",color:new a("#aaaaaa"),visible:this.inEditor||!t.hidden,wireframe:!!e});const n=yield this.createMeshByShape(t.shape,s,t.shapeParams);n.castShadow=null===(i=t.castShadow)||void 0===i||i,n.receiveShadow=null!==(r=t.castShadow)&&void 0!==r&&r,t.collisionDetection||(n.collisionShape=null),o=n,this._originalMaterials.set(o.id,n.material),o.traverse((e=>{}))}return e||((null!==(s=t.materialAssignments)&&void 0!==s?s:[]).filter((e=>null!=e.materialId)).forEach((e=>this.applyMaterial(o,e))),this.applyVertexMaterials(t,o)),o}))}createLandscape(e){var t;if(null==(null===(t=e.landscape)||void 0===t?void 0:t.options))return console.error(`No landscape options exist on scene object ${e.id} ${e.name}`),new l;const i=X(e.landscape.options);this.applyHeightMaps(i,e.landscape.heightMaps,!0);const r=new Y(e,this.renderingView,i,this.assetManagerService,this.assetsService,this.shaders,(t=>{var i;(null!==(i=e.materialAssignments)&&void 0!==i?i:[]).filter((e=>null!=e.materialId)).forEach((e=>this.applyMaterial(t,e)))}));return this.landscapeManagers.push(r),r.refreshGeometry(),i}applyHeightMaps(e,t,i=!1){const r=new q(e.sections);for(const e of null!=t?t:[]){const t=r.find(e.x,e.y);if(!t)return;const i=t.geometry.getAttribute("position");for(const t of e.points)i.setY(t.i,t.y);i.needsUpdate=!0}const a=e.sections;a.forEach((e=>{e.geometry.computeBoundsTree(),e.geometry.computeVertexNormals()})),this.inEditor&&!i||setTimeout((()=>Z(a)),50)}createMeshByShape(t,i,r={}){return e(this,void 0,void 0,(function*(){if("landscape"!==t&&ce.includes(t)){const e=yield prepareShapeParameters(null!=r?r:{});return"cylinder"==t&&e.openEnded,new G(le[t].geometry(e),i,le[t].collision(e))}if(this.inEditor)throw new Error(`Unsupported shape '${t}'`);console.warn(`Failed to create shape. Unsupported shape '${t}'. This might be because the hology/core library is not compatible with the editor version.`)}))}createFromAsset(t){var i,r,a,s;return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId);if(null==e)return void console.warn(`Can not find asset with id ${t.assetId} and name ${t.name}`);let{scene:o}=yield this.assetManagerService.getMesh(e);je(t.materialAssignments,e.materialAssignments).forEach((e=>this.applyMaterial(o,e)));const n=null===(r=null!==(i=t.receiveShadow)&&void 0!==i?i:!!e.receiveShadow)||void 0===r||r,l=null!==(s=null!==(a=t.castShadow)&&void 0!==a?a:!!e.castShadow)&&void 0!==s&&s;return o.receiveShadow=n,we(o,l,n),t.collisionDetection||(o.collisionShapes=[]),this.applyVertexMaterials(t,o),o.traverse((e=>{e instanceof d&&"computeBoundsTree"in e.geometry&&e.geometry.computeBoundsTree()})),o}))}createFromPrefabAsset(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId);if(null==e)return void console.warn(`Can not find asset with id ${t.assetId} and name ${t.name}`);const i=new l;return e.prefab.objects.filter((e=>"global_fog"!==e.type)).forEach((e=>this.materialize(e,i,!0))),i}))}createParticleSystem(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId),r=new p;return yield b.fromJSONAsync(e.particleSystem,i).then((e=>{const t=new M(r,i);e.addRenderer(t),this.renderingView.onLoop((t=>e.update()))})),r}))}createLight(t){var i;return e(this,void 0,void 0,(function*(){if("point"===t.light.type){const e=new f(t.light.point.color,t.light.point.intensity,t.light.point.distance,t.light.point.decay);if(e.castShadow=null===(i=t.light.point.castShadow)||void 0===i||i,this.inEditor){const t=new y(.3,10,10),i=new m({color:new a(16771709)}),r=new d(t,i);e.add(r)}return e}return"directional"===t.light.type?(this.applyDirectionalLight(t.light.directional),new l):"ambient"===t.light.type?(this.applyDirectionalAmbientLight(null,t.light.ambient),new l):void 0}))}applyDirectionalAmbientLight(e,t){const i=this.scene.children.find((e=>e.name===de));null!=i?(i.intensity=t.intensity,i.color.set(t.color),i.groundColor.set(t.color)):console.warn("Couldn't find ambient light")}applyDirectionalLight(e){for(const t of this.renderingView.csm.lights)t.intensity=e.intensity,t.color.set(e.color),t.castShadow=e.castShadow;this.renderingView.csm.lightDirection.fromArray(e.direction).normalize()}dispose(){this.updateSubscription.unsubscribe()}}function we(e,t,i){e.castShadow=t,e.receiveShadow=i,e.traverse((e=>{e.castShadow=t,e.receiveShadow=i}))}const Ae=new Map,Se=new h({color:16711935}),be=new Map;export function materialFromAsset(t,r,s,o,n,l=!0){var c,d,h,m,p,f,v,y,g,w,A;return e(this,void 0,void 0,(function*(){const e=JSON.stringify(t.material);if(l&&Ae.has(e))return Ae.get(e);const S={opacity:t.material.params.opacity,map:null,emissive:null!==(c=t.material.params.emissive)&&void 0!==c?c:null,metalness:null!==(d=t.material.params.metalness)&&void 0!==d?d:0,flatShading:null!==(h=t.material.params.flatShading)&&void 0!==h&&h,color:new a(t.material.params.color).convertSRGBToLinear(),transparent:null!=t.material.params.opacity&&t.material.params.opacity<1},b={};if(null!=t.material.params.map){const e=t.material.params.map,i=yield s.getAsset(e);null!=i&&(S.map=yield o.getTexture(i))}let M;switch(t.material.type){case"phong":M=new u(Object.assign(Object.assign({},S),b));break;case"water":M=te(S,r);break;case"grassFoliage":M=Q({color:S.color,map:S.map},r);break;case"grass":M=K(Object.assign(Object.assign({},S),{colorTwo:new a(t.material.params.colorTwo),colorThree:new a(t.material.params.colorThree)}),r);break;case"standard":case"lambert":case"shader":const e=null!==(m={standard:oe,lambert:ne}[t.material.type])&&void 0!==m?m:null===(p=n.find((e=>e.name==t.material.shader)))||void 0===p?void 0:p.type;if(e){const i=new e,a=yield Me(null!==(v=null===(f=t.material)||void 0===f?void 0:f.shaderParams)&&void 0!==v?v:{},e,s,o,null,r,n);Object.assign(i,a);try{M=i.build()}catch(e){console.log("Shader runtime error: "+e),be.has(t.material.shader)||be.set(t.material.shader,Se.clone()),M=be.get(t.material.shader)}M.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),M=Se;break;default:throw new Error("Unsupported material type"+t.material.type)}return null==r||r.csm.setupMaterial(M),l&&Ae.set(e,M),M.side=null!==(g=null!==(y=t.material.side)&&void 0!==y?y:M.side)&&void 0!==g?g:i.FrontSide,M.transparent=null!==(A=null!==(w=t.material.transparent)&&void 0!==w?w:S.transparent)&&void 0!==A&&A||M.transparent,M}))}function Me(t,i,r,a,s,o,n,l){return e(this,void 0,void 0,(function*(){const e={};for(const[i,c]of Object.entries(t)){const t=yield xe(c,r,a,s,o,n,l);null!=t&&(e[i]=t)}return e}))}export function prepareShapeParameters(t){return e(this,void 0,void 0,(function*(){const e={};for(const[i,r]of Object.entries(t)){const t=yield xe(r,null,null,null);null!=t&&(e[i]=t)}return e}))}function xe(t,i,r,o,n,l,c){return e(this,void 0,void 0,(function*(){if(null==t||null==t.value||""==t.value)return null;const e=t.value;switch(t.type){case ie.Number:case ie.FloatNode:let d="string"==typeof e?parseFloat(e):e;return t.type===ie.FloatNode?P(d):d;case ie.Texture:return yield r.getTexture(yield i.getAsset(e));case ie.Sampler2DNode:return C(yield r.getTexture(yield i.getAsset(e)));case ie.Boolean:return e;case ie.BooleanNode:return x(e);case ie.Vector2:case ie.Vec2Node:if("object"==typeof e){const i=e instanceof Array?(new w).fromArray(e):new w(e.x,e.y);return t.type===ie.Vec2Node?O(i):i}return null;case ie.Vector3:case ie.Vec3Node:if("object"==typeof e){const i=e instanceof Array?(new A).fromArray(e):new A(e.x,e.y,e.z);return t.type===ie.Vec3Node?k(i):i}return null;case ie.Color:case ie.RgbNode:const h=new a(e).convertSRGBToLinear();return t.type===ie.RgbNode?V(h):h;case ie.String:return e;case ie.BaseActor:const u=e;return null==o&&console.warn("Class parameters can not be prepared as actors are not passed in"),null==o?void 0:o.get(u);case ie.Euler:const m=e;return(new s).fromArray(m);case ie.Object3D:return(yield r.getMesh(yield i.getAsset(e))).scene;case ie.Material:return yield materialFromAsset(yield i.getAsset(e),n,i,r,l);case ie.AudioBuffer:return yield r.getAudio(yield i.getAsset(e));case ie.VisualEffect:const p=yield i.getAsset(e);if(null==c){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in p){const e=yield c.create(ve);return yield e.fromAsset(p),new ye(e)}console.error("Using a non-vfx asset for visual effect parameter")}return null}))}function Ie(e){var t,i;return"linear"===e.type?new o(new a(e.color),null!==(t=e.near)&&void 0!==t?t:100,null!==(i=e.far)&&void 0!==i?i:1e3):"density"===e.type?new n(e.color,e.density):void console.warn("Invalid fog type",e)}const Pe=new m({color:4229780});function De(t,r,a,o){var n;return e(this,void 0,void 0,(function*(){null==o&&(o=(new re).identity()),yield r(t,a,o);const e=o.clone().multiply(function(e,t){return t.compose((new A).fromArray(e.position),(new v).setFromEuler((new s).fromArray(e.rotation)),(new A).fromArray(e.scale))}(t,new i.Matrix4));return Promise.all((null!==(n=t.children)&&void 0!==n?n:[]).map((i=>De(i,r,t,e))))}))}export function toSerializedParamType(e){const t=e.constructor.prototype;return t instanceof Number||e===Number?ie.Number:t instanceof D||"function"==typeof e.prototype.isFloat?ie.FloatNode:t instanceof g||e===g||e.isTexture?ie.Texture:t instanceof se||e===N?ie.Sampler2DNode:t instanceof Boolean||e===Boolean?ie.Boolean:t instanceof I?ie.BooleanNode:t instanceof a||e==a?ie.Color:t instanceof E||"function"==typeof e.prototype.isRgb?ie.RgbNode:t instanceof w||e==w?ie.Vector2:t instanceof F||"function"==typeof e.prototype.isVec2?ie.Vec2Node:t instanceof A||e==A?ie.Vector3:t instanceof z||"function"==typeof e.prototype.isVec3?ie.Vec3Node:t instanceof String||e===String?ie.String:t instanceof ae||e==ae||e.prototype instanceof ae||e.prototype==ae?ie.BaseActor:t instanceof s||e==s?ie.Euler:t instanceof p||e==p?ie.Object3D:t instanceof c||e==c?ie.Material:t instanceof AudioBuffer||e==AudioBuffer?ie.AudioBuffer:t instanceof ye||e==ye?ie.VisualEffect:void console.warn("Failed to map parameter type to serialized version",{type:e})}export function prepareCustomParams(e,t,i={}){return Object.fromEntries(e.map((e=>{var r,a,s;return[e.name,{type:toSerializedParamType(e.type),value:null!==(s=null!==(a=null===(r=t[e.name])||void 0===r?void 0:r.value)&&void 0!==a?a:i[e.name])&&void 0!==s?s:customParameterDefaultValueByType.get(toSerializedParamType(e.type))}]})))}export function prepareCustomParamsFromType(e,t,i=null){const r=T(e);if(0===r.length)return{};let a;null!=i?pe(i,(()=>{a=i.get(e)})):a=new e;const s={};for(const e of r){const t=a[e.name];if(null!=t){const i=serializeCustomParameter(e.type,t);null!=i&&(s[e.name]=i)}}return prepareCustomParams(r,t,s)}export function serializeCustomParameter(e,t){function i(){console.error("Failed to serialize value",{type:e,value:t})}switch(e){case Number:case Boolean:return t;case w:return t instanceof w?t.toArray():void i();case A:return t instanceof A?t.toArray():void i();case S:return t instanceof S?t.toArray():void i();case a:return t instanceof a?"#"+t.getHexString():"string"==typeof t?t:"number"==typeof t?"#"+new a(t).getHexString():void i();case String:return t;case s:return t instanceof s?t.toArray():void i()}}function je(e,t){return function(e,t,i){const r=[],a=new Set;for(const s of[...null!=e?e:[],...null!=t?t:[]]){const e=i(s);a.has(e)||(a.add(e),r.push(s))}return r}((null!=e?e:[]).filter((e=>Ve(e.materialId))),(null!=t?t:[]).filter((e=>Ve(e.materialId))),(e=>e.color+e.name))}function Ve(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[ie.RgbNode,"#000000"],[ie.Color,"#000000"],[ie.Vector4,[0,0,0,0]],[ie.Vec4Node,[0,0,0,0]],[ie.Vector3,[0,0,0]],[ie.Vec3Node,[0,0,0]],[ie.Vector2,[0,0]],[ie.Vec2Node,[0,0]],[ie.Euler,[0,0,0,"XYZ"]]]);
1
+ import{__awaiter as e}from"tslib";import{Subject as t}from"rxjs";import*as i from"three";import{BoxGeometry as r,Color as a,Euler as s,Fog as o,FogExp2 as n,Group as l,Material as c,Mesh as d,MeshLambertMaterial as h,MeshPhongMaterial as u,MeshStandardMaterial as m,Object3D as p,PointLight as f,Quaternion as v,SphereGeometry as y,Texture as g,Vector2 as w,Vector3 as A,Vector4 as b}from"three";import S,{SpriteRenderer as M}from"three-nebula";import{bool as x,BooleanNode as I,float as P,FloatNode as D,NodeShaderMaterial as j,rgb as V,RgbNode as E,Texture2dLookupNode as N,textureSampler2d as C,vec2 as O,Vec2Node as F,vec3 as k,Vec3Node as z,vec4 as B}from"three-shader-graph";import _ from"../gameplay/actors/builtin";import{extractShaderParameters as T}from"../shader/parameter";import{groupBy as $,ArrayMap as L}from"../utils/collections";import{filterChildrenShallow as R,filterSceneShallow as U}from"../utils/three/traverse";import{AssetMeshInstance as H}from"./asset-resource-loader";import{BoxCollisionShape as W,PhysicalShapeMesh as G}from"./collision/collision-shape";import{isCollisionMesh as J}from"./collision/collision-shape-import";import{initLandscape as X}from"./landscape/landscape";import{LandscapeManager as Y}from"./landscape/landscape-manager";import{SectionGrid as q,smoothNormalsCrossMeshes as Z}from"./landscape/utils";import{createGrassMaterial as K}from"./materials/grass";import{createGrassFoliageMaterial as Q}from"./materials/grass-foliage";import{getMaterialAttribute as ee}from"./materials/utils/material-painting";import{createWaterMaterial as te}from"./materials/water";import{SerializedParamType as ie}from"./model";import{Matrix4 as re}from"three";import{BaseActor as ae}from"../gameplay/actors/actor";import{Sampler2DNode as se}from"../shader-nodes";import{StandardShader as oe}from"../shader/builtin/standard-shader";import{LambertShader as ne}from"../shader/builtin/lambert-shader";import{ShapeLibrary as le,ShapeLibraryKeys as ce}from"./objects/shapes";import{ambientLightName as de,createSky as he,defaultSkyMaterial as ue}from"./sky";import{ActorComponent as me,withInjectionContext as pe}from"../gameplay";import{iterateMaterials as fe}from"../utils/materials";import{VfxActor as ve}from"../effects/vfx/vfx-actor";import{VisualEffect as ye}from"../effects/vfx/vfx-param";const ge={};export const shapeDefaultColor="#aaaaaa";export class SceneMaterializerLoader{constructor(e,t,i){this.dataProvider=e,this.assetsService=t,this.assetManagerService=i}get(t,i){return new SceneMaterializer(t,this.dataProvider,this.assetsService,this.assetManagerService,i,[],[],{create:()=>null,initActor:()=>e(this,void 0,void 0,(function*(){}))})}}export class SceneMaterializer{constructor(i,r,a,s,o,n,l,c){this.scene=i,this.dataProvider=r,this.assetsService=a,this.assetManagerService=s,this.renderingView=o,this.shaders=n,this.actorTypes=l,this.actorProvider=c,this.objectMap=new Map,this.sceneObjectMap=new Map,this.components=[],this.landscapeManagers=[],this.materializedActors=new Map,this.inEditor=!0,this.updated$=new t,this.removed$=new t,this.error$=new t,this.editorActorParamSnapshot=new Map,this._canBeInstancedCache=new Map,this._originalMaterials=new Map,this.originalFog=null,r.onUpdate((e=>this.update(e))),r.onRemove((e=>this.remove(e))),this.updateSubscription=a.onUpdate.subscribe((t=>e(this,void 0,void 0,(function*(){"material"==t.type?((yield this.assetsService.getAssets()).filter((e=>{var i;return(null!==(i=e.materialAssignments)&&void 0!==i?i:[]).some((e=>e.materialId===t.id))})).forEach((e=>{const t=this.findByAssetId(e.id);e.materialAssignments.forEach((e=>{t.forEach((t=>{const i=t.userData.src.materialAssignments;null!=i&&i.some((t=>t.color===e.color))||this.applyMaterial(t,e)}))}))})),U(this.scene,(e=>{var i;return null!=e.userData.src&&(null!==(i=e.userData.src.materialAssignments)&&void 0!==i?i:[]).some((e=>e.materialId===t.id))}),(e=>null!=e.userData.src)).forEach((t=>e(this,void 0,void 0,(function*(){this.deleteSceneObject(t.userData.src),this.materialize(t.userData.src)}))))):"mesh"==t.type?this.findByAssetId(t.id).forEach((e=>{je(e.userData.src.materialAssignments,t.materialAssignments).forEach((t=>{this.applyMaterial(e,t)}))})):"prefab"===t.type&&this.findByAssetId(t.id).forEach((e=>{const t=e.userData.src;this.remove(t),this.materializeAndInitActor(t)}))}))))}get actorInstances(){return Array.from(this.materializedActors.values())}prefetchAssets(){return e(this,void 0,void 0,(function*(){const e=Array.from(new Set(this.dataProvider.getObjects().filter((e=>null!=e.assetId&&"asset_mesh"==e.type)).filter((e=>e.assetId))));yield Promise.all(e.map((e=>this.assetsService.getAsset(e.assetId).then((e=>e&&this.assetManagerService.getMesh(e))))))}))}init(){return e(this,void 0,void 0,(function*(){this.preInit(),Ae.clear(),yield this.prefetchAssets(),yield Promise.all(this.dataProvider.getObjects().map((e=>this.materialize(e)))),yield this.initActorsPostInit()}))}initActorsPostInit(t=this.actorInstances){const i=t.map((t=>e(this,void 0,void 0,(function*(){var e,i,r,a,s;const o=t.object.userData.src;if("vfx"===o.type)return Promise.resolve();const n=yield this.assetsService.getAsset(o.assetId),l=Object.assign(Object.assign({},null!==(i=null===(e=null==n?void 0:n.actor)||void 0===e?void 0:e.params)&&void 0!==i?i:{}),null!==(a=null===(r=o.actor)||void 0===r?void 0:r.params)&&void 0!==a?a:{});this.removeVfxChildActors(t);for(const e of null!==(s=o.actor.innerParams)&&void 0!==s?s:[])yield this.applyActorComponentParams(t,e.path.slice(),e.params);const c=yield Me(l,t.constructor,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,this.shaders,this.actorProvider);Object.assign(t,c),this.addVfxChildActors(t);try{return yield this.actorProvider.initActor(t)}catch(e){console.error(`Failed to initiate actor (name="${o.name}", id=${o.id})`,e)}}))));return Promise.all(i)}addVfxChildActors(e,t=e){for(const i of Object.keys(t))t[i]instanceof ye?null!=t[i].actor&&(console.log("add actor to world",t[i].actor),e.object.add(t[i].actor.object)):t[i]instanceof me&&this.addVfxChildActors(e,t[i])}removeVfxChildActors(e,t=e){for(const i of Object.keys(t))if(t[i]instanceof ye){if(null!=t[i].actor){t[i].actor.onEndPlay(),console.log("remve actor from world",t[i].actor),e.object.remove(t[i].actor.object)}}else t[i]instanceof me&&this.removeVfxChildActors(e,t[i])}applyActorComponentParams(t,i,r){return e(this,void 0,void 0,(function*(){const e=i.length,a=i.shift();if(0==e){const e=yield Me(r,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,this.shaders);for(const[i,r]of Object.entries(e))null!=r&&(t[i]=r)}else null!=t[a]&&(yield this.applyActorComponentParams(t[a],i,r))}))}canAssetBeInstanced(t){return e(this,void 0,void 0,(function*(){if(!this._canBeInstancedCache.has(t.assetId)){const e=yield this.createFromAsset(t);if(null==e)return!1;const i=[];e.traverse((e=>{!J(e)&&e.isMesh&&i.push(e)}));const r=1==i.length&&0==i[0].children.length,a=!0;this._canBeInstancedCache.set(t.assetId,r&&a)}return this._canBeInstancedCache.get(t.assetId)}))}preInit(){var e;null===(e=this.renderingView)||void 0===e||e.onLoop((()=>{var e;return null===(e=this.sky)||void 0===e?void 0:e.position.copy(this.renderingView.camera.position)}))}initWithInstancing(){return e(this,void 0,void 0,(function*(){this.preInit();const t=new L;for(const i of this.dataProvider.getObjects())yield De(i,((i,r,a)=>e(this,void 0,void 0,(function*(){var e,s;const o="asset_mesh"==i.type&&(yield this.canAssetBeInstanced(i))?i.assetId+JSON.stringify(null!==(e=i.materialAssignments)&&void 0!==e?e:[]):"other";"other"!==o&&r&&(null===(s=r.children)||void 0===s?void 0:s.length)>0&&r.children.splice(r.children.findIndex((e=>e.id===i.id)),1),"other"===o&&r||t.push(o,Object.assign(Object.assign({},i),{parentTransform:a}))}))));for(const[e,i]of t.entries())if("other"!==e&&i.length>0){const e=yield this.createFromAsset(i[0]);if(null==e)continue;const t=yield this.createInstancedMesh(i,e),r=new H;r.add(t),r.userData.src=i[0],e instanceof H&&(r.collisionShapes=e.collisionShapes),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r)}else yield Promise.all(i.map((e=>this.materialize(e))));yield this.initActorsPostInit()}))}createInstancedMesh(t,r){var a,o;return e(this,void 0,void 0,(function*(){const e=r.children.filter((e=>!J(e)))[0],n=yield this.assetsService.getAsset(t[0].assetId);yield this.applyMaterials(r,je(t[0].materialAssignments,n.materialAssignments)),e.updateMatrix();const l=e.geometry.clone().applyMatrix4(e.matrix),c=new i.InstancedMesh(l,e.material.clone(),t.length);c.material.side=i.FrontSide;for(let e=0;e<t.length;e++){const r=(new i.Matrix4).compose((new A).fromArray(t[e].position),(new v).setFromEuler((new s).fromArray(t[e].rotation)),(new A).fromArray(t[e].scale)),a=(new re).copy(t[e].parentTransform).multiply(r);c.setMatrixAt(e,a)}return c.castShadow=null===(a=n.castShadow)||void 0===a||a,c.receiveShadow=null===(o=n.receiveShadow)||void 0===o||o,c}))}remove(e){if(console.log("Remove scene object",e),"global_fog"==e.type)return void(this.scene.fog=this.originalFog);if("actor"==e.type){const t=this.materializedActors.get(e.id);null!=t&&(t.disposed.next(!0),t.onEndPlay(),this.removeVfxChildActors(t))}const t=this.sceneObjectMap.get(e.id);null==t||t.parent.remove(t),this.sceneObjectMap.delete(e.id),this.components.filter((t=>{var i;return(null===(i=t.object.userData.src)||void 0===i?void 0:i.id)===e.id})).forEach((e=>this.components.splice(this.components.indexOf(e,1)))),this.landscapeManagers.filter((t=>t.source.id===e.id)).forEach((e=>{e.clear(),e.stop(),this.landscapeManagers.splice(this.landscapeManagers.indexOf(e,1))})),this.removed$.next({object:t,source:e})}deleteSceneObject(e){const t=this.sceneObjectMap.get(e.id);if(this.scene.remove(t),"landscape"==e.type){const t=this.landscapeManagers.findIndex((t=>t.source.id===e.id));if(t>-1){const e=this.landscapeManagers.splice(t,1)[0];e.clear(),e.stop()}}}findByAssetId(e){return U(this.scene,(t=>{var i;return(null===(i=t.userData.src)||void 0===i?void 0:i.assetId)==e}),(e=>null!=e.userData.src))}applyMaterials(e,t){return null==t?Promise.resolve([]):Promise.all(t.filter((e=>"null"!==e.materialId)).map((t=>this.applyMaterial(e,t))))}applyMaterial(t,i){const r=[];return t.traverse((t=>e(this,void 0,void 0,(function*(){if(t instanceof d||t.isMesh)for(const e of fe(t.material))e.hasOwnProperty("color")&&r.push(t)})))),Promise.all(r.map((t=>e(this,void 0,void 0,(function*(){var e,r,s,o;if(t.material instanceof Array)for(let s=0;s<t.material.length;s++){const o=t.material[s];if(null==o.color||!(o.color instanceof a))continue;const n="#"+o.color.getHexString(),l=o.name;if(n===i.color&&(o.name===i.name||null==i.name)||t.userData["originalColor_"+s]===i.color&&t.userData["originalMaterialName_"+s]===i.name){const a=yield this.assetsService.getAsset(i.materialId),o=t.material[s];a&&(t.material[s]=yield materialFromAsset(a,this.renderingView,this.assetsService,this.assetManagerService,this.shaders),t.userData["originalColor_"+s]=null!==(e=t.userData["originalColor_"+s])&&void 0!==e?e:n,t.userData["originalMaterialName_"+s]=null!==(r=t.userData["originalMaterialName_"+s])&&void 0!==r?r:l,this.inEditor&&this._originalMaterials.set(t.id+"#"+s,o))}}else{const e="#"+t.material.color.getHexString(),r=t.material.name;if(e===i.color&&(t.material.name===i.name||null==i.name)||t.userData.originalColor===i.color&&t.userData.originalName===i.name){const a=yield this.assetsService.getAsset(i.materialId),n=t.material;a&&(t.material=yield materialFromAsset(a,this.renderingView,this.assetsService,this.assetManagerService,this.shaders),t.userData.originalColor=null!==(s=t.userData.originalColor)&&void 0!==s?s:e,t.userData.originalMaterialName=null!==(o=t.userData.originalMaterialName)&&void 0!==o?o:r,this.inEditor&&this._originalMaterials.set(t.id,n))}}})))))}unapplyMaterials(t){t.traverse((t=>e(this,void 0,void 0,(function*(){var e,i;if(t instanceof d)if(t.material instanceof Array)for(let i=0;i<t.material.length;i++)t.material[i]=null!==(e=this._originalMaterials.get(t.id+"#"+i))&&void 0!==e?e:t.material[i];else t.material=null!==(i=this._originalMaterials.get(t.id))&&void 0!==i?i:t.material}))))}updateActors(t){this.actorTypes=t;const i=new Set(Object.values(_));U(this.scene,(e=>{var t,r;return(null===(t=e.userData.src)||void 0===t?void 0:t.id)&&"actor"===e.userData.src.type&&this.materializedActors.has(null===(r=e.userData.src)||void 0===r?void 0:r.id)&&!i.has(e.userData.src.actor.type)})).forEach((t=>e(this,void 0,void 0,(function*(){this.remove(t.userData.src),yield this.materializeAndInitActor(t.userData.src)}))))}updateShaders(e){this.shaders=e;for(const[e,t]of Ae.entries())t.userData.customShaderName&&Ae.delete(e);this.landscapeManagers.forEach((t=>t.updateShaders(e))),U(this.scene,(e=>!0)).forEach((e=>{e.traverse((e=>{var t,i;if(e instanceof d){if(null!=(null===(t=e.material.userData)||void 0===t?void 0:t.customShaderName)){const t=null===(i=function(e,t){if(t(e))return e;let i;return e.traverseAncestors((e=>{null==i&&t(e)&&(i=e)})),i}(e,(e=>{var t;return null!=(null===(t=e.userData.src)||void 0===t?void 0:t.id)})))||void 0===i?void 0:i.userData.src;null!=t&&this.update(t)}}}))}))}update(t){return e(this,void 0,void 0,(function*(){if("sky"===t.type&&null!=this.sky&&null!=this.sky.parent)return void this.updateSky(t);const e=this.sceneObjectMap.get(t.id);if(e){const r=this.findParent(t);if(null!=r&&r.uuid!=e.uuid?r.attach(e):console.error("Parent is wrong"),"prefab"!==t.type){this.unapplyMaterials(e);this.inEditor&&t.hidden&&!1?e.traverse((e=>{e instanceof d&&(e.material.wireframe=!0)})):e.traverse((e=>{e instanceof d&&(e.material.wireframe=!1)}))}if("asset_mesh"===t.type){const i=yield this.assetsService.getAsset(t.assetId);je(t.materialAssignments,i.materialAssignments).forEach((t=>this.applyMaterial(e,t)))}else"shape_mesh"===t.type&&this.applyMaterials(e,t.materialAssignments);let s=!1;if(e.traverseAncestors((e=>{"_hology_transform_group"===e.name&&(s=!0)})),s||(e.position.fromArray(t.position),e.scale.fromArray(t.scale),e.rotation.fromArray(t.rotation)),this.applyVertexMaterials(t,e),"light"==t.type)if("point"==t.light.type){const i=e;i.color=new a(t.light.point.color),i.intensity=t.light.point.intensity,i.decay=t.light.point.decay,i.castShadow=t.light.point.castShadow,i.distance=Math.max(t.light.point.distance,0)}else"directional"===t.light.type?this.applyDirectionalLight(t.light.directional):"ambient"===t.light.type&&this.applyDirectionalAmbientLight(e,t.light.ambient);else if("landscape"===t.shape)this.applyHeightMaps(e,t.landscape.heightMaps),this.inEditor&&this.landscapeManagers.filter((e=>e.source.id===t.id)).forEach((e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,(e=>!0))));else if("global_fog"===t.type){const e=(this.scene.fog instanceof n?"density":"linear")!==t.fog.type;this.scene.fog=Ie(t.fog),e&&(i=this.scene).traverse((e=>{if(e instanceof d){const t=e.material;t instanceof j&&(i.fog instanceof o?(t.uniforms.fogFar.value=i.fog.far,t.uniforms.fogNear.value=i.fog.near):i.fog instanceof n&&(t.uniforms.density={value:i.fog.density}),t.needsUpdate=!0,t.uniformsNeedUpdate=!0)}})),this.fixFogColor()}else if("actor"===t.type){if(this.materializedActors.has(t.id)){const e=this.editorActorParamSnapshot.get(t.id);null!=e&&e===JSON.stringify(t.actor)||(console.log("Rematerializing actor because parameters changed"),this.remove(t),yield this.materializeAndInitActor(t))}}else if("shape_mesh"===t.type){const i=yield this.createMeshByShape(t.shape,e.material,t.shapeParams);e instanceof G&&(e.geometry=i.geometry,e.collisionShape=i.collisionShape)}("asset_mesh"===t.type||"shape_mesh"===t.type&&"landscape"!==t.shape)&&we(e,t.castShadow,t.receiveShadow),t.name&&t.name.length>0&&(e.name=t.name),this.updated$.next({object:e,source:t})}else{const e=yield this.materializeAndInitActor(t);this.updated$.next({object:e,source:t})}var i}))}materializeAndInitActor(t,i=this.findParent(t)){return e(this,void 0,void 0,(function*(){const r=yield this.materialize(t,i);return De(t,(t=>e(this,void 0,void 0,(function*(){if("actor"===t.type){const e=this.materializedActors.get(t.id);null!=e?yield this.initActorsPostInit([e]):console.error(`Something went wrong when creating actor ${t.id}`)}})))),r}))}findParent(e){const t=this.dataProvider.getObjects().flatMap((t=>t.id===e.id?null:R(t,(t=>{var i;return null===(i=t.children)||void 0===i?void 0:i.some((t=>t.id===e.id))}),(()=>!0))))[0];return null==t?this.scene:null!=t?U(this.scene,(e=>{var i,r;return(null===(r=null===(i=e.userData)||void 0===i?void 0:i.src)||void 0===r?void 0:r.id)===t.id}),(e=>{var t;return null!=(null===(t=e.userData)||void 0===t?void 0:t.src)}))[0]:void 0}fixFogColor(){!0===this.renderingView.options.enableOutlines&&(this.scene.fog.color=new a(this.scene.fog.color).convertSRGBToLinear())}findMeshWithGeometry(e){let t;return e.traverse((e=>{e instanceof d&&e.geometry&&(t=e)})),t}applyVertexMaterials(e,t){if(null==e.vertexMaterials||0===e.vertexMaterials.length)return;const i=$(e.vertexMaterials,(e=>e.m));t.traverse((e=>{if(e instanceof d){const t=ee(e,!1);if(null!=t){for(let e=0;e<t.array.length;e++)t.setX(e,0);t.needsUpdate=!0}}}));const r=new Set;for(const[e,a]of i.entries()){const i=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let s=!1;if(null==i)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=ee(i,!0);for(let e=0;e<o.array.length;e++)o.setX(e,0);for(const e of a)o.setX(e.i,e.w[0]),o.setY(e.i,e.w[1]),o.setZ(e.i,e.w[2]),s=!0;s&&r.add(e)}this.inEditor&&this.landscapeManagers.filter((t=>t.source.id===e.id)).forEach((e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,(e=>r.has(e.name)))))}materialize(t,i,a=!1){var s,o,n,c;return e(this,void 0,void 0,(function*(){let e;switch(t.type){case"asset_mesh":e=yield this.createFromAsset(t);break;case"shape_mesh":e=yield this.createFromShape(t);break;case"light":e=yield this.createLight(t);break;case"particles":e=yield this.createParticleSystem(t),t.collisionDetection=!1;break;case"global_fog":this.scene.fog=Ie(t.fog),this.fixFogColor(),e=new l;break;case"sky":this.sky=he(),this.updateSky(t),e=this.sky;break;case"actor":e=yield this.createFromActor(t);break;case"group":e=new l;break;case"prefab":e=yield this.createFromPrefabAsset(t);break;case"vfx":e=yield this.createFromVfx(t);break;default:if(this.inEditor)throw new Error("unknown type "+t.type);console.warn(`Failed to materialize object. Unknown type '${t.type}'. This might be because the hology/core library is not compatible with the editor version.`)}if(null!=e){if(t.name&&t.name.length>0&&(e.name=t.name),e.position.fromArray(t.position),e.scale.fromArray(t.scale),e.rotation.fromArray(t.rotation),a||(e.userData.src=t),!this.inEditor){const i=null!==(s=t.components)&&void 0!==s?s:[],r=null!=t.assetId&&null!==(n=null===(o=yield this.assetsService.getAsset(t.assetId))||void 0===o?void 0:o.components)&&void 0!==n?n:[];i.push(...r),i.length>0?e.userData.componentRefs=yield Promise.all(i.map(((i,r)=>this.createComponent(e,t,i,r)))):"asset_mesh"==t.type&&function(e){e.traverse((e=>{e.matrixAutoUpdate=!1,e.matrixWorldNeedsUpdate=!1}));const t=e.updateMatrixWorld;e.updateMatrixWorld=function(){t.apply(e),e.updateMatrixWorld=function(){}}}(e)}if(this.inEditor){let t=null;e instanceof G&&(t=function(e){if(e instanceof W)return new d(new r(...e.offset.toArray()),Pe);return null}(e.collisionShape)),null!=t&&(t.layers.disable(0),t.layers.enable(18),t.scale.multiplyScalar(1.1),e.add(t))}return this.objectMap.set(e.uuid,t),this.sceneObjectMap.set(t.id,e),null==i?this.scene.add(e):null==i||i.add(e),null!=t.children&&(yield Promise.all(null===(c=t.children)||void 0===c?void 0:c.map((t=>this.materialize(t,e,a))))),e}}))}updateSky(t){var r;return e(this,void 0,void 0,(function*(){if(null==(null===(r=null==t?void 0:t.sky)||void 0===r?void 0:r.materialId))return void(this.sky.material=ue);const e=yield this.assetsService.getAsset(t.sky.materialId),a=yield materialFromAsset(e,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1);a.side=i.BackSide,null!=this.sky?this.sky.material=a:console.warn("No sky has been created")}))}createComponent(t,i,r,a){return e(this,void 0,void 0,(function*(){const e=new ge[r.path+"/"+r.className],s=i.id+a;e.id=s,e.object=t;for(const t of r.params)null!=t.value&&(e[t.name]=t.value);return this.components.push(e),s}))}createFromActor(t){var i,r,a;return e(this,void 0,void 0,(function*(){const e=null!==(r=null===(i=this.actorTypes.find((e=>{var i;return e.name===(null===(i=t.actor)||void 0===i?void 0:i.type)})))||void 0===i?void 0:i.type)&&void 0!==r?r:_[null===(a=t.actor)||void 0===a?void 0:a.type];if(null==e)return null;this.inEditor&&this.editorActorParamSnapshot.set(t.id,JSON.stringify(t.actor));const o=yield this.actorProvider.create(e,(new A).fromArray(t.position),(new s).fromArray(t.rotation),!0);return this.materializedActors.set(t.id,o),null==o?void 0:o.object}))}createFromVfx(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId);null==e&&console.error("Could not find asset",t);const i=ve,r=yield this.actorProvider.create(i,(new A).fromArray(t.position),(new s).fromArray(t.rotation),!1);return yield r.fromAsset(e),r.play(),this.materializedActors.set(t.id,r),null==r?void 0:r.object}))}cleanup(){this.materializedActors.clear()}createFromShape(t){var i,r,s;return e(this,void 0,void 0,(function*(){const e=this.inEditor&&t.hidden;let o;if("landscape"==t.shape)o=this.createLandscape(t);else{let s=new m({name:"Default",color:new a("#aaaaaa"),visible:this.inEditor||!t.hidden,wireframe:!!e});const n=yield this.createMeshByShape(t.shape,s,t.shapeParams);n.castShadow=null===(i=t.castShadow)||void 0===i||i,n.receiveShadow=null!==(r=t.castShadow)&&void 0!==r&&r,t.collisionDetection||(n.collisionShape=null),o=n,this._originalMaterials.set(o.id,n.material),o.traverse((e=>{}))}return e||((null!==(s=t.materialAssignments)&&void 0!==s?s:[]).filter((e=>null!=e.materialId)).forEach((e=>this.applyMaterial(o,e))),this.applyVertexMaterials(t,o)),o}))}createLandscape(e){var t;if(null==(null===(t=e.landscape)||void 0===t?void 0:t.options))return console.error(`No landscape options exist on scene object ${e.id} ${e.name}`),new l;const i=X(e.landscape.options);this.applyHeightMaps(i,e.landscape.heightMaps,!0);const r=new Y(e,this.renderingView,i,this.assetManagerService,this.assetsService,this.shaders,(t=>{var i;(null!==(i=e.materialAssignments)&&void 0!==i?i:[]).filter((e=>null!=e.materialId)).forEach((e=>this.applyMaterial(t,e)))}));return this.landscapeManagers.push(r),r.refreshGeometry(),i}applyHeightMaps(e,t,i=!1){const r=new q(e.sections);for(const e of null!=t?t:[]){const t=r.find(e.x,e.y);if(!t)return;const i=t.geometry.getAttribute("position");for(const t of e.points)i.setY(t.i,t.y);i.needsUpdate=!0}const a=e.sections;a.forEach((e=>{e.geometry.computeBoundsTree(),e.geometry.computeVertexNormals()})),this.inEditor&&!i||setTimeout((()=>Z(a)),50)}createMeshByShape(t,i,r={}){return e(this,void 0,void 0,(function*(){if("landscape"!==t&&ce.includes(t)){const e=yield prepareShapeParameters(null!=r?r:{});return"cylinder"==t&&e.openEnded,new G(le[t].geometry(e),i,le[t].collision(e))}if(this.inEditor)throw new Error(`Unsupported shape '${t}'`);console.warn(`Failed to create shape. Unsupported shape '${t}'. This might be because the hology/core library is not compatible with the editor version.`)}))}createFromAsset(t){var i,r,a,s;return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId);if(null==e)return void console.warn(`Can not find asset with id ${t.assetId} and name ${t.name}`);let{scene:o}=yield this.assetManagerService.getMesh(e);je(t.materialAssignments,e.materialAssignments).forEach((e=>this.applyMaterial(o,e)));const n=null===(r=null!==(i=t.receiveShadow)&&void 0!==i?i:!!e.receiveShadow)||void 0===r||r,l=null!==(s=null!==(a=t.castShadow)&&void 0!==a?a:!!e.castShadow)&&void 0!==s&&s;return o.receiveShadow=n,we(o,l,n),t.collisionDetection||(o.collisionShapes=[]),this.applyVertexMaterials(t,o),o.traverse((e=>{e instanceof d&&"computeBoundsTree"in e.geometry&&e.geometry.computeBoundsTree()})),o}))}createFromPrefabAsset(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId);if(null==e)return void console.warn(`Can not find asset with id ${t.assetId} and name ${t.name}`);const i=new l;return e.prefab.objects.filter((e=>"global_fog"!==e.type)).forEach((e=>this.materialize(e,i,!0))),i}))}createParticleSystem(t){return e(this,void 0,void 0,(function*(){const e=yield this.assetsService.getAsset(t.assetId),r=new p;return yield S.fromJSONAsync(e.particleSystem,i).then((e=>{const t=new M(r,i);e.addRenderer(t),this.renderingView.onLoop((t=>e.update()))})),r}))}createLight(t){var i;return e(this,void 0,void 0,(function*(){if("point"===t.light.type){const e=new f(t.light.point.color,t.light.point.intensity,t.light.point.distance,t.light.point.decay);if(e.castShadow=null===(i=t.light.point.castShadow)||void 0===i||i,this.inEditor){const t=new y(.3,10,10),i=new m({color:new a(16771709)}),r=new d(t,i);e.add(r)}return e}return"directional"===t.light.type?(this.applyDirectionalLight(t.light.directional),new l):"ambient"===t.light.type?(this.applyDirectionalAmbientLight(null,t.light.ambient),new l):void 0}))}applyDirectionalAmbientLight(e,t){const i=this.scene.children.find((e=>e.name===de));null!=i?(i.intensity=t.intensity,i.color.set(t.color),i.groundColor.set(t.color)):console.warn("Couldn't find ambient light")}applyDirectionalLight(e){for(const t of this.renderingView.csm.lights)t.intensity=e.intensity,t.color.set(e.color),t.castShadow=e.castShadow;this.renderingView.csm.lightDirection.fromArray(e.direction).normalize()}dispose(){this.updateSubscription.unsubscribe()}}function we(e,t,i){e.castShadow=t,e.receiveShadow=i,e.traverse((e=>{e.castShadow=t,e.receiveShadow=i}))}const Ae=new Map,be=new h({color:16711935}),Se=new Map;export function materialFromAsset(t,r,s,o,n,l=!0){var c,d,h,m,p,f,v,y,g,w,A;return e(this,void 0,void 0,(function*(){const e=JSON.stringify(t.material);if(l&&Ae.has(e))return Ae.get(e);const b={opacity:t.material.params.opacity,map:null,emissive:null!==(c=t.material.params.emissive)&&void 0!==c?c:null,metalness:null!==(d=t.material.params.metalness)&&void 0!==d?d:0,flatShading:null!==(h=t.material.params.flatShading)&&void 0!==h&&h,color:new a(t.material.params.color).convertSRGBToLinear(),transparent:null!=t.material.params.opacity&&t.material.params.opacity<1},S={};if(null!=t.material.params.map){const e=t.material.params.map,i=yield s.getAsset(e);null!=i&&(b.map=yield o.getTexture(i))}let M;switch(t.material.type){case"phong":M=new u(Object.assign(Object.assign({},b),S));break;case"water":M=te(b,r);break;case"grassFoliage":M=Q({color:b.color,map:b.map},r);break;case"grass":M=K(Object.assign(Object.assign({},b),{colorTwo:new a(t.material.params.colorTwo),colorThree:new a(t.material.params.colorThree)}),r);break;case"standard":case"lambert":case"shader":const e=null!==(m={standard:oe,lambert:ne}[t.material.type])&&void 0!==m?m:null===(p=n.find((e=>e.name==t.material.shader)))||void 0===p?void 0:p.type;if(e){const i=new e,a=yield Me(null!==(v=null===(f=t.material)||void 0===f?void 0:f.shaderParams)&&void 0!==v?v:{},e,s,o,null,r,n);Object.assign(i,a);try{M=i.build()}catch(e){console.log("Shader runtime error: "+e),Se.has(t.material.shader)||Se.set(t.material.shader,be.clone()),M=Se.get(t.material.shader)}M.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),M=be;break;default:throw new Error("Unsupported material type"+t.material.type)}return null==r||r.csm.setupMaterial(M),l&&Ae.set(e,M),M.side=null!==(g=null!==(y=t.material.side)&&void 0!==y?y:M.side)&&void 0!==g?g:i.FrontSide,M.transparent=null!==(A=null!==(w=t.material.transparent)&&void 0!==w?w:b.transparent)&&void 0!==A&&A||M.transparent,t.material.bloom&&(M.userData.hasBloom=!0),M}))}function Me(t,i,r,a,s,o,n,l){return e(this,void 0,void 0,(function*(){const e={};for(const[i,c]of Object.entries(t)){const t=yield xe(c,r,a,s,o,n,l);null!=t&&(e[i]=t)}return e}))}export function prepareShapeParameters(t){return e(this,void 0,void 0,(function*(){const e={};for(const[i,r]of Object.entries(t)){const t=yield xe(r,null,null,null);null!=t&&(e[i]=t)}return e}))}function xe(t,i,r,o,n,l,c){return e(this,void 0,void 0,(function*(){if(null==t||null==t.value||""==t.value)return null;const e=t.value;switch(t.type){case ie.Number:case ie.FloatNode:let d="string"==typeof e?parseFloat(e):e;return t.type===ie.FloatNode?P(d):d;case ie.Texture:return yield r.getTexture(yield i.getAsset(e));case ie.Sampler2DNode:return C(yield r.getTexture(yield i.getAsset(e)));case ie.Boolean:return e;case ie.BooleanNode:return x(e);case ie.Vector2:case ie.Vec2Node:if("object"==typeof e){const i=e instanceof Array?(new w).fromArray(e):new w(e.x,e.y);return t.type===ie.Vec2Node?O(i):i}return null;case ie.Vector3:case ie.Vec3Node:if("object"==typeof e){const i=e instanceof Array?(new A).fromArray(e):new A(e.x,e.y,e.z);return t.type===ie.Vec3Node?k(i):i}return null;case ie.Color:case ie.RgbNode:const h=new a(e).convertSRGBToLinear();return t.type===ie.RgbNode?V(h):h;case ie.String:return e;case ie.BaseActor:const u=e;return null==o&&console.warn("Class parameters can not be prepared as actors are not passed in"),null==o?void 0:o.get(u);case ie.Euler:const m=e;return(new s).fromArray(m);case ie.Object3D:return(yield r.getMesh(yield i.getAsset(e))).scene;case ie.Material:return yield materialFromAsset(yield i.getAsset(e),n,i,r,l);case ie.AudioBuffer:return yield r.getAudio(yield i.getAsset(e));case ie.VisualEffect:const p=yield i.getAsset(e);if(null==c){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in p){const e=yield c.create(ve);return yield e.fromAsset(p),new ye(e)}console.error("Using a non-vfx asset for visual effect parameter")}return null}))}function Ie(e){var t,i;return"linear"===e.type?new o(new a(e.color),null!==(t=e.near)&&void 0!==t?t:100,null!==(i=e.far)&&void 0!==i?i:1e3):"density"===e.type?new n(e.color,e.density):void console.warn("Invalid fog type",e)}const Pe=new m({color:4229780});function De(t,r,a,o){var n;return e(this,void 0,void 0,(function*(){null==o&&(o=(new re).identity()),yield r(t,a,o);const e=o.clone().multiply(function(e,t){return t.compose((new A).fromArray(e.position),(new v).setFromEuler((new s).fromArray(e.rotation)),(new A).fromArray(e.scale))}(t,new i.Matrix4));return Promise.all((null!==(n=t.children)&&void 0!==n?n:[]).map((i=>De(i,r,t,e))))}))}export function toSerializedParamType(e){const t=e.constructor.prototype;return t instanceof Number||e===Number?ie.Number:t instanceof D||"function"==typeof e.prototype.isFloat?ie.FloatNode:t instanceof g||e===g||e.isTexture?ie.Texture:t instanceof se||e===N?ie.Sampler2DNode:t instanceof Boolean||e===Boolean?ie.Boolean:t instanceof I?ie.BooleanNode:t instanceof a||e==a?ie.Color:t instanceof E||"function"==typeof e.prototype.isRgb?ie.RgbNode:t instanceof w||e==w?ie.Vector2:t instanceof F||"function"==typeof e.prototype.isVec2?ie.Vec2Node:t instanceof A||e==A?ie.Vector3:t instanceof z||"function"==typeof e.prototype.isVec3?ie.Vec3Node:t instanceof String||e===String?ie.String:t instanceof ae||e==ae||e.prototype instanceof ae||e.prototype==ae?ie.BaseActor:t instanceof s||e==s?ie.Euler:t instanceof p||e==p?ie.Object3D:t instanceof c||e==c?ie.Material:t instanceof AudioBuffer||e==AudioBuffer?ie.AudioBuffer:t instanceof ye||e==ye?ie.VisualEffect:void console.warn("Failed to map parameter type to serialized version",{type:e})}export function prepareCustomParams(e,t,i={}){return Object.fromEntries(e.map((e=>{var r,a,s;return[e.name,{type:toSerializedParamType(e.type),value:null!==(s=null!==(a=null===(r=t[e.name])||void 0===r?void 0:r.value)&&void 0!==a?a:i[e.name])&&void 0!==s?s:customParameterDefaultValueByType.get(toSerializedParamType(e.type))}]})))}export function prepareCustomParamsFromType(e,t,i=null){const r=T(e);if(0===r.length)return{};let a;null!=i?pe(i,(()=>{a=i.get(e)})):a=new e;const s={};for(const e of r){const t=a[e.name];if(null!=t){const i=serializeCustomParameter(e.type,t);null!=i&&(s[e.name]=i)}}return prepareCustomParams(r,t,s)}export function serializeCustomParameter(e,t){function i(){console.error("Failed to serialize value",{type:e,value:t})}switch(e){case Number:case Boolean:return t;case w:return t instanceof w?t.toArray():void i();case A:return t instanceof A?t.toArray():void i();case b:return t instanceof b?t.toArray():void i();case a:return t instanceof a?"#"+t.getHexString():"string"==typeof t?t:"number"==typeof t?"#"+new a(t).getHexString():void i();case String:return t;case s:return t instanceof s?t.toArray():void i()}}function je(e,t){return function(e,t,i){const r=[],a=new Set;for(const s of[...null!=e?e:[],...null!=t?t:[]]){const e=i(s);a.has(e)||(a.add(e),r.push(s))}return r}((null!=e?e:[]).filter((e=>Ve(e.materialId))),(null!=t?t:[]).filter((e=>Ve(e.materialId))),(e=>e.color+e.name))}function Ve(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[ie.RgbNode,"#000000"],[ie.Color,"#000000"],[ie.Vector4,[0,0,0,0]],[ie.Vec4Node,[0,0,0,0]],[ie.Vector3,[0,0,0]],[ie.Vec3Node,[0,0,0]],[ie.Vector2,[0,0]],[ie.Vec2Node,[0,0]],[ie.Euler,[0,0,0,"XYZ"]]]);
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -61,6 +61,7 @@ export interface Asset {
61
61
  params: Partial<MaterialParameters>;
62
62
  shaderParams?: Record<string, CustomParamValue>;
63
63
  shader?: string;
64
+ bloom?: boolean;
64
65
  };
65
66
  mesh?: {
66
67
  rescale?: number;
@@ -1,2 +1,3 @@
1
1
  export * from './parameter';
2
2
  export * from './builtin';
3
+ export * from './shader';
@@ -1,4 +1,4 @@
1
- export*from"./parameter";export*from"./builtin";
1
+ export*from"./parameter";export*from"./builtin";export*from"./shader";
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
@@ -1,6 +1,7 @@
1
1
  import { Object3D, Vector3 } from 'three';
2
2
  type ObjectPredicate<T> = (obj: T) => boolean;
3
3
  export declare function filterScene(scene: Object3D, predicate: ObjectPredicate<Object3D>): any[];
4
+ export declare function findFirstVisibleObject(scene: Object3D, predicate: ObjectPredicate<Object3D>): Object3D;
4
5
  /**
5
6
  * Only continue traverse through children if it has not yet matched.
6
7
  * Use a traverse predicate to know if it chould event continue
@@ -1,4 +1,4 @@
1
- import{Scene as e,Vector3 as t}from"three";export function filterScene(e,t){const r=[];return e.traverse((e=>{t(e)&&r.push(e)})),r}export function filterSceneShallow(e,t,r){return filterChildrenShallow(e,t,r)}export function filterChildrenShallow(t,r,n){var l;const o=[],c=[t];for(;c.length>0;){const t=c.pop();r(t)?o.push(t):(null==n||n(t)||t instanceof e)&&c.push(...null!==(l=t.children)&&void 0!==l?l:[])}return o}const r=new t;export function calculateEffectiveScale(e){return r.copy(e.scale),e.traverseAncestors((e=>{r.multiply(e.scale)})),r}
1
+ import{Scene as e,Vector3 as n}from"three";export function filterScene(e,n){const t=[];return e.traverse((e=>{n(e)&&t.push(e)})),t}export function findFirstVisibleObject(e,n){const t=[e];for(;t.length>0;){const e=t.pop();if(n(e))return e;e.visible&&null!=e.children&&t.push(...e.children)}return null}export function filterSceneShallow(e,n,t){return filterChildrenShallow(e,n,t)}export function filterChildrenShallow(n,t,r){const l=[],o=[n];for(;o.length>0;){const n=o.pop();t(n)?l.push(n):(null==r||r(n)||n instanceof e)&&null!=n.children&&o.push(...n.children)}return l}const t=new n;export function calculateEffectiveScale(e){return t.copy(e.scale),e.traverseAncestors((e=>{t.multiply(e.scale)})),t}
2
2
  /*
3
3
  * Copyright (©) 2023. All rights reserved.
4
4
  * See the LICENSE.md file for details.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hology/core",
3
- "version": "0.0.31",
3
+ "version": "0.0.32",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -94,7 +94,7 @@
94
94
  "three-mesh-bvh": "^0.4.0",
95
95
  "three-nebula": "^10.0.3",
96
96
  "three-shader-graph": "^0.1.24",
97
- "three-stdlib": "~2.17.3",
97
+ "three-stdlib": "2.17.3",
98
98
  "ts-key-enum": "^2.0.12",
99
99
  "typedi": "^0.10.0"
100
100
  },