UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 7.83 kB
import{extend as t}from"../../../core/core.js";import{events as e}from"../../../core/events.js";import{Color as s}from"../../../core/math/color.js";import{Curve as i}from"../../../core/math/curve.js";import{CurveSet as n}from"../../../core/math/curve-set.js";import{Vec2 as a}from"../../../core/math/vec2.js";import{Vec3 as o}from"../../../core/math/vec3.js";import{Vec4 as r}from"../../../core/math/vec4.js";import{Entity as c}from"../../entity.js";import{Component as p}from"../component.js";import{ComponentSystem as l}from"../system.js";import{ScriptLegacyComponent as h}from"./component.js";import{ScriptLegacyComponentData as d}from"./data.js";const u=["enabled","scripts","instances","runInTools"],f="initialize",m="postInitialize",y="update",v="postUpdate",b="fixedUpdate",_="toolsUpdate";class U extends l{constructor(t){super(t),this.id="script",this.ComponentType=h,this.DataType=d,this.schema=u,this.preloading=!1,this.instancesWithUpdate=[],this.instancesWithFixedUpdate=[],this.instancesWithPostUpdate=[],this.instancesWithToolsUpdate=[],this.on("beforeremove",this.onBeforeRemove,this),this.app.systems.on(f,this.onInitialize,this),this.app.systems.on(m,this.onPostInitialize,this),this.app.systems.on(y,this.onUpdate,this),this.app.systems.on(b,this.onFixedUpdate,this),this.app.systems.on(v,this.onPostUpdate,this),this.app.systems.on(_,this.onToolsUpdate,this)}initializeComponentData(t,e,s){s=["runInTools","enabled","scripts"],e.scripts&&e.scripts.length&&e.scripts.forEach((t=>{if(t.attributes&&Array.isArray(t.attributes)){const e={};for(let s=0;s<t.attributes.length;s++)e[t.attributes[s].name]=t.attributes[s];t.attributes=e}})),super.initializeComponentData(t,e,s)}cloneComponent(e,s){const i=this.store[e.getGuid()],n={runInTools:i.data.runInTools,scripts:[],enabled:i.data.enabled},a=i.data.scripts;for(let e=0,s=a.length;e<s;e++){const s=a[e].attributes;s&&delete a[e].attributes,n.scripts.push(t({},a[e])),s&&(n.scripts[e].attributes=this._cloneAttributes(s),a[e].attributes=s)}return this.addComponent(s,n)}onBeforeRemove(t,e){e.enabled&&this._disableScriptComponent(e),this._destroyScriptComponent(e)}onInitialize(t){if(this._registerInstances(t),t.enabled){t.script&&t.script.enabled&&this._initializeScriptComponent(t.script);const e=t._children;for(let t=0,s=e.length;t<s;t++)e[t]instanceof c&&this.onInitialize(e[t])}}onPostInitialize(t){if(t.enabled){t.script&&t.script.enabled&&this._postInitializeScriptComponent(t.script);const e=t._children;for(let t=0,s=e.length;t<s;t++)e[t]instanceof c&&this.onPostInitialize(e[t])}}_callInstancesMethod(t,e){const s=t.data.instances;for(const t in s)if(s.hasOwnProperty(t)){const i=s[t].instance;i[e]&&i[e]()}}_initializeScriptComponent(t){this._callInstancesMethod(t,f),t.data.initialized=!0,t.enabled&&t.entity.enabled&&this._enableScriptComponent(t)}_enableScriptComponent(t){this._callInstancesMethod(t,"onEnable")}_disableScriptComponent(t){this._callInstancesMethod(t,"onDisable")}_destroyScriptComponent(t){const e=t.data.instances;for(const s in e)if(e.hasOwnProperty(s)){const i=e[s].instance;if(i.destroy&&i.destroy(),i.update){const t=this.instancesWithUpdate.indexOf(i);t>=0&&this.instancesWithUpdate.splice(t,1)}if(i.fixedUpdate){const t=this.instancesWithFixedUpdate.indexOf(i);t>=0&&this.instancesWithFixedUpdate.splice(t,1)}if(i.postUpdate){const t=this.instancesWithPostUpdate.indexOf(i);t>=0&&this.instancesWithPostUpdate.splice(t,1)}if(i.toolsUpdate){const t=this.instancesWithToolsUpdate.indexOf(i);t>=0&&this.instancesWithToolsUpdate.splice(t,1)}t.instances[s].instance===t[s]&&delete t[s],delete t.instances[s]}}_postInitializeScriptComponent(t){this._callInstancesMethod(t,m),t.data.postInitialized=!0}_updateInstances(t,e,s){for(let i=0,n=e.length;i<n;i++){const n=e[i];n&&n.entity&&n.entity.enabled&&n.entity.script.enabled&&n[t](s)}}onUpdate(t){this._updateInstances(y,this.instancesWithUpdate,t)}onFixedUpdate(t){this._updateInstances(b,this.instancesWithFixedUpdate,t)}onPostUpdate(t){this._updateInstances(v,this.instancesWithPostUpdate,t)}onToolsUpdate(t){this._updateInstances(_,this.instancesWithToolsUpdate,t)}broadcast(t,e){const s=Array.prototype.slice.call(arguments,2),i=this.store;for(const n in i)if(i.hasOwnProperty(n)){const a=i[n].data;if(a.instances[t]){const i=a.instances[t].instance[e];i&&i.apply(a.instances[t].instance,s)}}}_preRegisterInstance(t,e,s,i){if(t.script){if(t.script.data._instances=t.script.data._instances||{},t.script.data._instances[s])throw Error(`Script name collision '${s}'. Scripts from '${e}' and '${t.script.data._instances[s].url}' {${t.getGuid()}}`);t.script.data._instances[s]={url:e,name:s,instance:i}}}_registerInstances(t){if(t.script&&t.script.data._instances){t.script.instances=t.script.data._instances;for(const s in t.script.instances){const i=t.script.instances[s],n=i.instance;if(e.attach(n),n.update&&this.instancesWithUpdate.push(n),n.fixedUpdate&&this.instancesWithFixedUpdate.push(n),n.postUpdate&&this.instancesWithPostUpdate.push(n),n.toolsUpdate&&this.instancesWithToolsUpdate.push(n),t.script.scripts&&this._createAccessors(t,i),t.script[s])throw Error(`Script with name '${s}' is already attached to Script Component`);t.script[s]=n}delete t.script.data._instances}const s=t._children;for(let t=0,e=s.length;t<e;t++)s[t]instanceof c&&this._registerInstances(s[t])}_cloneAttributes(e){const s={};for(const i in e)if(e.hasOwnProperty(i))if("entity"!==e[i].type)s[i]=t({},e[i]);else{const n=e[i].value;delete e[i].value,s[i]=t({},e[i]),s[i].value=n,e[i].value=n}return s}_createAccessors(t,e){const s=t.script.scripts.length,i=e.url;for(let n=0;n<s;n++){const s=t.script.scripts[n];if(s.url===i){const i=s.attributes;if(s.name&&i){for(const t in i)i.hasOwnProperty(t)&&this._createAccessor(i[t],e);t.script.data.attributes[s.name]=this._cloneAttributes(i)}break}}}_createAccessor(t,e){const s=this;t={name:t.name,value:t.value,type:t.type},this._convertAttributeValue(t),Object.defineProperty(e.instance,t.name,{get:function(){return t.value},set:function(i){const n=t.value;t.value=i,s._convertAttributeValue(t),e.instance.fire("set",t.name,n,t.value)},configurable:!0})}_updateAccessors(t,e){const s=t.script.scripts.length,i=e.url;for(let n=0;n<s;n++){const s=t.script,a=s.scripts[n];if(a.url===i){const t=a.name,i=a.attributes;if(t){if(i)for(const t in i)i.hasOwnProperty(t)&&this._createAccessor(i[t],e);const n=s.data.attributes[t];if(n)for(const t in n){const s=n[t];t in i?i[t].value!==s.value&&e.instance.onAttributeChanged&&e.instance.onAttributeChanged(s.name,s.value,i[t].value):delete e.instance[s.name]}i?s.data.attributes[t]=this._cloneAttributes(i):delete s.data.attributes[t]}break}}}_convertAttributeValue(t){if("rgb"===t.type||"rgba"===t.type)Array.isArray(t.value)&&(t.value=3===t.value.length?new s(t.value[0],t.value[1],t.value[2]):new s(t.value[0],t.value[1],t.value[2],t.value[3]));else if("vec2"===t.type)Array.isArray(t.value)&&(t.value=new a(t.value[0],t.value[1]));else if("vec3"===t.type||"vector"===t.type)Array.isArray(t.value)&&(t.value=new o(t.value[0],t.value[1],t.value[2]));else if("vec4"===t.type)Array.isArray(t.value)&&(t.value=new r(t.value[0],t.value[1],t.value[2],t.value[3]));else if("entity"===t.type)null!==t.value&&"string"==typeof t.value&&(t.value=this.app.root.findByGuid(t.value));else if("curve"===t.type||"colorcurve"===t.type){const e=t.value.keys[0]instanceof Array?n:i;t.value=new e(t.value.keys),t.value.type=t.value.type}}destroy(){super.destroy(),this.app.systems.off(f,this.onInitialize,this),this.app.systems.off(m,this.onPostInitialize,this),this.app.systems.off(y,this.onUpdate,this),this.app.systems.off(b,this.onFixedUpdate,this),this.app.systems.off(v,this.onPostUpdate,this),this.app.systems.off(_,this.onToolsUpdate,this)}}p._buildAccessors(h.prototype,u);export{U as ScriptLegacyComponentSystem};