babyeditor-tool 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/babyeditor.tool.cjs.js +1 -1
- package/dist/babyeditor.tool.cjs.js.map +1 -1
- package/dist/babyeditor.tool.es.js +11 -5
- package/dist/babyeditor.tool.es.js.map +1 -1
- package/dist/babyeditor.tool.umd.js +1 -1
- package/dist/babyeditor.tool.umd.js.map +1 -1
- package/package.json +1 -1
- package/types/tool/CustomSystem.d.ts +3 -1
- package/types/tool/CustomSystem.d.ts.map +1 -1
- package/types/tool/CustomSystem.js +9 -2
- package/types/tool/SceneLoader.d.ts +27 -2
- package/types/tool/SceneLoader.d.ts.map +1 -1
- package/types/tool/SceneLoader.js +3 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@babylonjs/core");require("@babylonjs/materials"),require("@babylonjs/loaders"),require("@babylonjs/post-processes"),require("@babylonjs/procedural-textures");const s=require("@babylonjs/havok");class t{constructor(e){this.scene=e,this.load()}load(){const e=this.scene.transformNodes;for(let s=0;s<e.length;s++){const n=e[s];if(n.metadata){const e=n.metadata;"assetModel"===e.meshBuilderType&&e.assetModelBuilderOptions?.url&&t.LoadAssetModel(n,e.assetModelBuilderOptions.url,this.scene)}}}static async LoadAssetModel(s,t,n){const i=t=>{t instanceof e.Node&&!t.parent&&(t.parent=s),t instanceof e.Mesh&&t.material&&(t.material.doNotSerialize=!0),t.doNotSerialize=!0},{meshes:a,transformNodes:c,lights:r,skeletons:o}=await e.ImportMeshAsync(t,n);a.forEach(e=>i(e)),c.forEach(e=>i(e)),r.forEach(e=>i(e)),o.forEach(e=>i(e))}}var n=Object.defineProperty,i=(e,s,t)=>((e,s,t)=>s in e?n(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t)(e,"symbol"!=typeof s?s+"":s,t);class a{constructor(s,t,n){i(this,"container"),i(this,"canvas"),i(this,"engine"),i(this,"scene"),i(this,"sceneData",""),i(this,"
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@babylonjs/core");require("@babylonjs/materials"),require("@babylonjs/loaders"),require("@babylonjs/post-processes"),require("@babylonjs/procedural-textures");const s=require("@babylonjs/havok");class t{constructor(e,s=[]){this.scene=e,this.scriptInstanceList=s,this.load()}load(){const e=this.scene.transformNodes;for(let s=0;s<e.length;s++){const n=e[s];if(n.metadata){const e=n.metadata;"assetModel"===e.meshBuilderType&&e.assetModelBuilderOptions?.url&&t.LoadAssetModel(n,e.assetModelBuilderOptions.url,this.scene).then(()=>{const e=this.scriptInstanceList.find(e=>e.node===n);e&&"function"==typeof e.ready&&e.ready()})}}}static async LoadAssetModel(s,t,n){const i=t=>{t instanceof e.Node&&!t.parent&&(t.parent=s),t instanceof e.Mesh&&t.material&&(t.material.doNotSerialize=!0),t.doNotSerialize=!0},{meshes:a,transformNodes:c,lights:r,skeletons:o}=await e.ImportMeshAsync(t,n);a.forEach(e=>i(e)),c.forEach(e=>i(e)),r.forEach(e=>i(e)),o.forEach(e=>i(e))}}var n=Object.defineProperty,i=(e,s,t)=>((e,s,t)=>s in e?n(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t)(e,"symbol"!=typeof s?s+"":s,t);class a{constructor(s,t,n){i(this,"container"),i(this,"canvas"),i(this,"engine"),i(this,"scene"),i(this,"sceneData",""),i(this,"scriptsMap",{}),i(this,"scriptInstanceList",[]),this.container=s,this.canvas=document.createElement("canvas"),this.canvas.className="main-display-canvas",this.canvas.width=s.clientWidth,this.canvas.height=s.clientHeight,this.container.appendChild(this.canvas),this.engine=new e.Engine(this.canvas,!0),this.scene=new e.Scene(this.engine),this.load(t,n)}async load(n,i){this.scene&&this.scene.dispose(),i&&(this.scriptsMap=i),this.scene=new e.Scene(this.engine),this.sceneData=n,this.scriptInstanceList=[],this.scene.onBeforeRenderObservable.add(()=>{if(this.scriptInstanceList){const e=this.engine.getDeltaTime();for(let s=0;s<this.scriptInstanceList.length;s++){const t=this.scriptInstanceList[s];t.update&&t.update(e)}}});const a=await s();let c;this.scene.enablePhysics(new e.Vector3(0,-9.81,0),new e.HavokPlugin(!0,a)),await e.AppendSceneAsync("data:"+n,this.scene),c=0===this.scene.cameras.length?new e.FreeCamera("摄影机",new e.Vector3(50,50,50),this.scene,!0):this.scene.activeCamera||this.scene.cameras[0],c.attachControl(this.canvas),i&&this.initScripts(i),new t(this.scene,this.scriptInstanceList),this.render()}initScripts(e){if(!e)return;if(this.scene.metadata){const s=this.scene.metadata.scripts;s&&s.length>0&&this.runScript(this.scene,e,s)}const s=this.scene.getNodes();for(let t=0;t<s.length;t++){const n=s[t];n.metadata?.scripts&&n.metadata.scripts.length>0&&this.runScript(n,e,n.metadata.scripts)}}runScript(e,s,t){if(t)for(let n=0;n<t.length;n++){const i=t[n];for(const t in s)if(Object.prototype.hasOwnProperty.call(s,t)&&t===i.key&&!0!==i.disabled){let t=s[i.key];if(t instanceof Function){const s=new t(this.scene,e,i.values||{});if(s.start&&s.start(),s.dispose&&e.onDisposeObservable){const t=s.dispose;e.onDisposeObservable.addOnce(t.bind(s))}this.scriptInstanceList.push(s)}}}}render(){let e=this.scene;this.engine.runRenderLoop(()=>{e.render()})}resize(){this.engine.resize()}dispose(){this.scene.dispose(),this.engine.dispose()}static LoadCustomSystem(){}}exports.SceneLoader=a,exports.loadScene=function(e,s,t={}){return new a(e,s,t)};
|
|
2
2
|
//# sourceMappingURL=babyeditor.tool.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babyeditor.tool.cjs.js","sources":["../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh } from \"@babylonjs/core\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene) {\r\n this.load()\r\n }\r\n\r\n load () {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene)\r\n }\r\n }\r\n }\r\n }\r\n\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof Mesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, AbstractMesh, Camera, Node, TransformNode } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scritpsMap: ScriptsMap = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true)\r\n this.scene = new Scene(this.engine)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scritpsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n new CustomSystem(this.scene)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap)\r\n\r\n return sceneLoader\r\n}\r\n\r\nexport type IScript = {\r\n start?: () => void,\r\n update?: (deltaTime: number) => void,\r\n dispose?: () => void,\r\n}\r\n"],"names":["CustomSystem","constructor","scene","this","load","transNodes","transformNodes","i","length","transNode","metadata","metaData","meshBuilderType","assetModelBuilderOptions","url","LoadAssetModel","parentNode","applyMetaData","node","Node","parent","Mesh","material","doNotSerialize","meshes","lights","skeletons","ImportMeshAsync","forEach","SceneLoader","container","sceneData","scriptsMap","__publicField","canvas","document","createElement","className","width","clientWidth","height","clientHeight","appendChild","engine","Engine","Scene","dispose","scritpsMap","scriptInstanceList","onBeforeRenderObservable","add","deltaTime","getDeltaTime","script","update","havokModule","HavokPhysics","camera","enablePhysics","Vector3","HavokPlugin","AppendSceneAsync","cameras","FreeCamera","activeCamera","attachControl","initScripts","render","scriptList","scripts","runScript","nodes","getNodes","key","Object","prototype","hasOwnProperty","call","disabled","Function","instance","values","start","onDisposeObservable","callback","addOnce","bind","push","runRenderLoop","resize","LoadCustomSystem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"babyeditor.tool.cjs.js","sources":["../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh } from \"@babylonjs/core\";\r\nimport { IScript } from \"./SceneLoader\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene, private scriptInstanceList: IScript[] = []) {\r\n this.load()\r\n }\r\n\r\n load () {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n // 当对象是外部资源模型时\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene).then(() => {\r\n const findInstance = this.scriptInstanceList.find(instance => instance.node === transNode)\r\n if (findInstance && typeof findInstance.ready === 'function') {\r\n findInstance.ready()\r\n }\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof Mesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, AbstractMesh, Camera, Node, TransformNode } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scriptsMap: ScriptsMap = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true)\r\n this.scene = new Scene(this.engine)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scriptsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n new CustomSystem(this.scene, this.scriptInstanceList)\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap)\r\n\r\n return sceneLoader\r\n}\r\n\r\n/**\r\n * 脚本代码结构\r\n */\r\nexport type IScript = {\r\n /**\r\n * 脚执行时注入的场景对象\r\n */\r\n scene: Scene,\r\n /**\r\n * 当前实例化脚本绑定的对象\r\n */\r\n node: Node | Scene,\r\n /**\r\n * 脚本初始化执行的钩子函数\r\n */\r\n start?: () => void,\r\n /**\r\n * 当有异步动作初始化完成时的钩子函数\r\n */\r\n ready?: () => void,\r\n /**\r\n * 当没帧渲染是执行函数\r\n * @param deltaTime 间隔时间\r\n */\r\n update?: (deltaTime: number) => void,\r\n /**\r\n * 当对象被销毁时执行的函数\r\n */\r\n dispose?: () => void,\r\n}\r\n"],"names":["CustomSystem","constructor","scene","scriptInstanceList","this","load","transNodes","transformNodes","i","length","transNode","metadata","metaData","meshBuilderType","assetModelBuilderOptions","url","LoadAssetModel","then","findInstance","find","instance","node","ready","parentNode","applyMetaData","Node","parent","Mesh","material","doNotSerialize","meshes","lights","skeletons","ImportMeshAsync","forEach","SceneLoader","container","sceneData","scriptsMap","__publicField","canvas","document","createElement","className","width","clientWidth","height","clientHeight","appendChild","engine","Engine","Scene","dispose","onBeforeRenderObservable","add","deltaTime","getDeltaTime","script","update","havokModule","HavokPhysics","camera","enablePhysics","Vector3","HavokPlugin","AppendSceneAsync","cameras","FreeCamera","activeCamera","attachControl","initScripts","render","scriptList","scripts","runScript","nodes","getNodes","key","Object","prototype","hasOwnProperty","call","disabled","Function","values","start","onDisposeObservable","callback","addOnce","bind","push","runRenderLoop","resize","LoadCustomSystem"],"mappings":"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"}
|
|
@@ -5,8 +5,9 @@ import "@babylonjs/post-processes";
|
|
|
5
5
|
import "@babylonjs/procedural-textures";
|
|
6
6
|
import HavokPhysics from "@babylonjs/havok";
|
|
7
7
|
class CustomSystem {
|
|
8
|
-
constructor(scene) {
|
|
8
|
+
constructor(scene, scriptInstanceList = []) {
|
|
9
9
|
this.scene = scene;
|
|
10
|
+
this.scriptInstanceList = scriptInstanceList;
|
|
10
11
|
this.load();
|
|
11
12
|
}
|
|
12
13
|
load() {
|
|
@@ -16,7 +17,12 @@ class CustomSystem {
|
|
|
16
17
|
if (transNode.metadata) {
|
|
17
18
|
const metaData = transNode.metadata;
|
|
18
19
|
if (metaData.meshBuilderType === "assetModel" && metaData.assetModelBuilderOptions?.url) {
|
|
19
|
-
CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene)
|
|
20
|
+
CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene).then(() => {
|
|
21
|
+
const findInstance = this.scriptInstanceList.find((instance) => instance.node === transNode);
|
|
22
|
+
if (findInstance && typeof findInstance.ready === "function") {
|
|
23
|
+
findInstance.ready();
|
|
24
|
+
}
|
|
25
|
+
});
|
|
20
26
|
}
|
|
21
27
|
}
|
|
22
28
|
}
|
|
@@ -54,7 +60,7 @@ class SceneLoader {
|
|
|
54
60
|
__publicField(this, "engine");
|
|
55
61
|
__publicField(this, "scene");
|
|
56
62
|
__publicField(this, "sceneData", "");
|
|
57
|
-
__publicField(this, "
|
|
63
|
+
__publicField(this, "scriptsMap", {});
|
|
58
64
|
__publicField(this, "scriptInstanceList", []);
|
|
59
65
|
this.container = container;
|
|
60
66
|
this.canvas = document.createElement("canvas");
|
|
@@ -75,7 +81,7 @@ class SceneLoader {
|
|
|
75
81
|
if (this.scene) {
|
|
76
82
|
this.scene.dispose();
|
|
77
83
|
}
|
|
78
|
-
if (scriptsMap) this.
|
|
84
|
+
if (scriptsMap) this.scriptsMap = scriptsMap;
|
|
79
85
|
this.scene = new Scene(this.engine);
|
|
80
86
|
this.sceneData = sceneData;
|
|
81
87
|
this.scriptInstanceList = [];
|
|
@@ -100,8 +106,8 @@ class SceneLoader {
|
|
|
100
106
|
camera = this.scene.activeCamera || this.scene.cameras[0];
|
|
101
107
|
}
|
|
102
108
|
camera.attachControl(this.canvas);
|
|
103
|
-
new CustomSystem(this.scene);
|
|
104
109
|
if (scriptsMap) this.initScripts(scriptsMap);
|
|
110
|
+
new CustomSystem(this.scene, this.scriptInstanceList);
|
|
105
111
|
this.render();
|
|
106
112
|
}
|
|
107
113
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babyeditor.tool.es.js","sources":["../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh } from \"@babylonjs/core\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene) {\r\n this.load()\r\n }\r\n\r\n load () {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene)\r\n }\r\n }\r\n }\r\n }\r\n\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof Mesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, AbstractMesh, Camera, Node, TransformNode } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scritpsMap: ScriptsMap = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true)\r\n this.scene = new Scene(this.engine)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scritpsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n new CustomSystem(this.scene)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap)\r\n\r\n return sceneLoader\r\n}\r\n\r\nexport type IScript = {\r\n start?: () => void,\r\n update?: (deltaTime: number) => void,\r\n dispose?: () => void,\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"babyeditor.tool.es.js","sources":["../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh } from \"@babylonjs/core\";\r\nimport { IScript } from \"./SceneLoader\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene, private scriptInstanceList: IScript[] = []) {\r\n this.load()\r\n }\r\n\r\n load () {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n // 当对象是外部资源模型时\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene).then(() => {\r\n const findInstance = this.scriptInstanceList.find(instance => instance.node === transNode)\r\n if (findInstance && typeof findInstance.ready === 'function') {\r\n findInstance.ready()\r\n }\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof Mesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, AbstractMesh, Camera, Node, TransformNode } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scriptsMap: ScriptsMap = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true)\r\n this.scene = new Scene(this.engine)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scriptsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n new CustomSystem(this.scene, this.scriptInstanceList)\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap)\r\n\r\n return sceneLoader\r\n}\r\n\r\n/**\r\n * 脚本代码结构\r\n */\r\nexport type IScript = {\r\n /**\r\n * 脚执行时注入的场景对象\r\n */\r\n scene: Scene,\r\n /**\r\n * 当前实例化脚本绑定的对象\r\n */\r\n node: Node | Scene,\r\n /**\r\n * 脚本初始化执行的钩子函数\r\n */\r\n start?: () => void,\r\n /**\r\n * 当有异步动作初始化完成时的钩子函数\r\n */\r\n ready?: () => void,\r\n /**\r\n * 当没帧渲染是执行函数\r\n * @param deltaTime 间隔时间\r\n */\r\n update?: (deltaTime: number) => void,\r\n /**\r\n * 当对象被销毁时执行的函数\r\n */\r\n dispose?: () => void,\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports,require("@babylonjs/core"),require("@babylonjs/materials"),require("@babylonjs/loaders"),require("@babylonjs/post-processes"),require("@babylonjs/procedural-textures"),require("@babylonjs/havok")):"function"==typeof define&&define.amd?define(["exports","@babylonjs/core","@babylonjs/materials","@babylonjs/loaders","@babylonjs/post-processes","@babylonjs/procedural-textures","@babylonjs/havok"],s):s(((e="undefined"!=typeof globalThis?globalThis:e||self).BabyEditor=e.BabyEditor||{},e.BabyEditor.Tool={}),e.BABYLON,null,null,null,null,e.HavokPhysics)}(this,function(e,s,t,n,i,a,o){"use strict";class c{constructor(e){this.scene=e,this.load()}load(){const e=this.scene.transformNodes;for(let s=0;s<e.length;s++){const t=e[s];if(t.metadata){const e=t.metadata;"assetModel"===e.meshBuilderType&&e.assetModelBuilderOptions?.url&&c.LoadAssetModel(t,e.assetModelBuilderOptions.url,this.scene)}}}static async LoadAssetModel(e,t,n){const i=t=>{t instanceof s.Node&&!t.parent&&(t.parent=e),t instanceof s.Mesh&&t.material&&(t.material.doNotSerialize=!0),t.doNotSerialize=!0},{meshes:a,transformNodes:o,lights:c,skeletons:r}=await s.ImportMeshAsync(t,n);a.forEach(e=>i(e)),o.forEach(e=>i(e)),c.forEach(e=>i(e)),r.forEach(e=>i(e))}}var r=Object.defineProperty,l=(e,s,t)=>((e,s,t)=>s in e?r(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t)(e,"symbol"!=typeof s?s+"":s,t);class h{constructor(e,t,n){l(this,"container"),l(this,"canvas"),l(this,"engine"),l(this,"scene"),l(this,"sceneData",""),l(this,"
|
|
1
|
+
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports,require("@babylonjs/core"),require("@babylonjs/materials"),require("@babylonjs/loaders"),require("@babylonjs/post-processes"),require("@babylonjs/procedural-textures"),require("@babylonjs/havok")):"function"==typeof define&&define.amd?define(["exports","@babylonjs/core","@babylonjs/materials","@babylonjs/loaders","@babylonjs/post-processes","@babylonjs/procedural-textures","@babylonjs/havok"],s):s(((e="undefined"!=typeof globalThis?globalThis:e||self).BabyEditor=e.BabyEditor||{},e.BabyEditor.Tool={}),e.BABYLON,null,null,null,null,e.HavokPhysics)}(this,function(e,s,t,n,i,a,o){"use strict";class c{constructor(e,s=[]){this.scene=e,this.scriptInstanceList=s,this.load()}load(){const e=this.scene.transformNodes;for(let s=0;s<e.length;s++){const t=e[s];if(t.metadata){const e=t.metadata;"assetModel"===e.meshBuilderType&&e.assetModelBuilderOptions?.url&&c.LoadAssetModel(t,e.assetModelBuilderOptions.url,this.scene).then(()=>{const e=this.scriptInstanceList.find(e=>e.node===t);e&&"function"==typeof e.ready&&e.ready()})}}}static async LoadAssetModel(e,t,n){const i=t=>{t instanceof s.Node&&!t.parent&&(t.parent=e),t instanceof s.Mesh&&t.material&&(t.material.doNotSerialize=!0),t.doNotSerialize=!0},{meshes:a,transformNodes:o,lights:c,skeletons:r}=await s.ImportMeshAsync(t,n);a.forEach(e=>i(e)),o.forEach(e=>i(e)),c.forEach(e=>i(e)),r.forEach(e=>i(e))}}var r=Object.defineProperty,l=(e,s,t)=>((e,s,t)=>s in e?r(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t)(e,"symbol"!=typeof s?s+"":s,t);class h{constructor(e,t,n){l(this,"container"),l(this,"canvas"),l(this,"engine"),l(this,"scene"),l(this,"sceneData",""),l(this,"scriptsMap",{}),l(this,"scriptInstanceList",[]),this.container=e,this.canvas=document.createElement("canvas"),this.canvas.className="main-display-canvas",this.canvas.width=e.clientWidth,this.canvas.height=e.clientHeight,this.container.appendChild(this.canvas),this.engine=new s.Engine(this.canvas,!0),this.scene=new s.Scene(this.engine),this.load(t,n)}async load(e,t){this.scene&&this.scene.dispose(),t&&(this.scriptsMap=t),this.scene=new s.Scene(this.engine),this.sceneData=e,this.scriptInstanceList=[],this.scene.onBeforeRenderObservable.add(()=>{if(this.scriptInstanceList){const e=this.engine.getDeltaTime();for(let s=0;s<this.scriptInstanceList.length;s++){const t=this.scriptInstanceList[s];t.update&&t.update(e)}}});const n=await o();let i;this.scene.enablePhysics(new s.Vector3(0,-9.81,0),new s.HavokPlugin(!0,n)),await s.AppendSceneAsync("data:"+e,this.scene),i=0===this.scene.cameras.length?new s.FreeCamera("摄影机",new s.Vector3(50,50,50),this.scene,!0):this.scene.activeCamera||this.scene.cameras[0],i.attachControl(this.canvas),t&&this.initScripts(t),new c(this.scene,this.scriptInstanceList),this.render()}initScripts(e){if(!e)return;if(this.scene.metadata){const s=this.scene.metadata.scripts;s&&s.length>0&&this.runScript(this.scene,e,s)}const s=this.scene.getNodes();for(let t=0;t<s.length;t++){const n=s[t];n.metadata?.scripts&&n.metadata.scripts.length>0&&this.runScript(n,e,n.metadata.scripts)}}runScript(e,s,t){if(t)for(let n=0;n<t.length;n++){const i=t[n];for(const t in s)if(Object.prototype.hasOwnProperty.call(s,t)&&t===i.key&&!0!==i.disabled){let t=s[i.key];if(t instanceof Function){const s=new t(this.scene,e,i.values||{});if(s.start&&s.start(),s.dispose&&e.onDisposeObservable){const t=s.dispose;e.onDisposeObservable.addOnce(t.bind(s))}this.scriptInstanceList.push(s)}}}}render(){let e=this.scene;this.engine.runRenderLoop(()=>{e.render()})}resize(){this.engine.resize()}dispose(){this.scene.dispose(),this.engine.dispose()}static LoadCustomSystem(){}}e.SceneLoader=h,e.loadScene=function(e,s,t={}){return new h(e,s,t)},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=babyeditor.tool.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babyeditor.tool.umd.js","sources":["../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh } from \"@babylonjs/core\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene) {\r\n this.load()\r\n }\r\n\r\n load () {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene)\r\n }\r\n }\r\n }\r\n }\r\n\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof Mesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, AbstractMesh, Camera, Node, TransformNode } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scritpsMap: ScriptsMap = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true)\r\n this.scene = new Scene(this.engine)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scritpsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n new CustomSystem(this.scene)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap)\r\n\r\n return sceneLoader\r\n}\r\n\r\nexport type IScript = {\r\n start?: () => void,\r\n update?: (deltaTime: number) => void,\r\n dispose?: () => void,\r\n}\r\n"],"names":["CustomSystem","constructor","scene","this","load","transNodes","transformNodes","i","length","transNode","metadata","metaData","meshBuilderType","assetModelBuilderOptions","url","LoadAssetModel","parentNode","applyMetaData","node","Node","parent","Mesh","material","doNotSerialize","meshes","lights","skeletons","ImportMeshAsync","forEach","SceneLoader","container","sceneData","scriptsMap","__publicField","canvas","document","createElement","className","width","clientWidth","height","clientHeight","appendChild","engine","Engine","Scene","dispose","scritpsMap","scriptInstanceList","onBeforeRenderObservable","add","deltaTime","getDeltaTime","script","update","havokModule","HavokPhysics","camera","enablePhysics","Vector3","HavokPlugin","AppendSceneAsync","cameras","FreeCamera","activeCamera","attachControl","initScripts","render","scriptList","scripts","runScript","nodes","getNodes","key","Object","prototype","hasOwnProperty","call","disabled","Function","instance","values","start","onDisposeObservable","callback","addOnce","bind","push","runRenderLoop","resize","LoadCustomSystem"],"mappings":"iqBAGO,MAAMA,EACX,WAAAC,CAAoBC,GAAAC,KAAAD,MAAAA,EAClBC,KAAKC,MACP,CAEA,IAAAA,GACE,MAAMC,EAAaF,KAAKD,MAAMI,eAE9B,IAAA,IAASC,EAAI,EAAGA,EAAIF,EAAWG,OAAQD,IAAK,CAC1C,MAAME,EAAYJ,EAAWE,GAC7B,GAAIE,EAAUC,SAAU,CACtB,MAAMC,EAAqBF,EAAUC,SACJ,eAA7BC,EAASC,iBAAoCD,EAASE,0BAA0BC,KAClFd,EAAae,eAAeN,EAAWE,EAASE,yBAAyBC,IAAKX,KAAKD,MAEvF,CACF,CACF,CAEA,2BAAaa,CAAgBC,EAA2BF,EAAaZ,GACnE,MAAMe,EAAiBC,IACjBA,aAAgBC,EAAAA,OAASD,EAAKE,SAChCF,EAAKE,OAASJ,GAEZE,aAAgBG,EAAAA,MAAQH,EAAKI,WAC/BJ,EAAKI,SAASC,gBAAiB,GAEjCL,EAAKK,gBAAiB,IAElBC,OAAEA,EAAAlB,eAAQA,EAAAmB,OAAgBA,EAAAC,UAAQA,SAAoBC,EAAAA,gBAAgBb,EAAKZ,GACjFsB,EAAOI,QAAQV,GAAQD,EAAcC,IACrCZ,EAAesB,QAAQV,GAAQD,EAAcC,IAC7CO,EAAOG,QAAQV,GAAQD,EAAcC,IACrCQ,EAAUE,QAAQV,GAAQD,EAAcC,GAC1C,4JCKK,MAAMW,EAmCX,WAAA5B,CAAY6B,EAA2BC,EAAmBC,GA/B1DC,EAAA9B,KAAA,aAIA8B,EAAA9B,KAAA,UAIA8B,EAAA9B,KAAA,UAIA8B,EAAA9B,KAAA,SAIA8B,EAAA9B,KAAA,YAAoB,IAIpB8B,EAAA9B,KAAA,aAAyB,IAIzB8B,EAAA9B,KAAQ,qBAAgC,IAQtCA,KAAK2B,UAAYA,EACjB3B,KAAK+B,OAASC,SAASC,cAAc,UACrCjC,KAAK+B,OAAOG,UAAY,sBACxBlC,KAAK+B,OAAOI,MAAQR,EAAUS,YAC9BpC,KAAK+B,OAAOM,OAASV,EAAUW,aAC/BtC,KAAK2B,UAAUY,YAAYvC,KAAK+B,QAChC/B,KAAKwC,OAAS,IAAIC,EAAAA,OAAOzC,KAAK+B,QAAQ,GACtC/B,KAAKD,MAAQ,IAAI2C,QAAM1C,KAAKwC,QAE5BxC,KAAKC,KAAK2B,EAAWC,EACvB,CAOA,UAAM5B,CAAM2B,EAAmBC,GACzB7B,KAAKD,OACPC,KAAKD,MAAM4C,UAETd,SAAiBe,WAAaf,GAClC7B,KAAKD,MAAQ,IAAI2C,QAAM1C,KAAKwC,QAC5BxC,KAAK4B,UAAYA,EACjB5B,KAAK6C,mBAAqB,GAG1B7C,KAAKD,MAAM+C,yBAAyBC,IAAI,KACtC,GAAI/C,KAAK6C,mBAAoB,CAC3B,MAAMG,EAAYhD,KAAKwC,OAAOS,eAC9B,IAAA,IAAS7C,EAAI,EAAGA,EAAIJ,KAAK6C,mBAAmBxC,OAAQD,IAAK,CACvD,MAAM8C,EAASlD,KAAK6C,mBAAmBzC,GACnC8C,EAAOC,QACTD,EAAOC,OAAOH,EAElB,CACF,IAGF,MAAMI,QAAoBC,IAI1B,IAAIC,EAHJtD,KAAKD,MAAMwD,cAAc,IAAIC,EAAAA,QAAQ,GAAG,KAAO,GAAI,IAAIC,EAAAA,aAAY,EAAML,UAEnEM,EAAAA,iBAAiB,QAAU9B,EAAW5B,KAAKD,OAG/CuD,EADgC,IAA9BtD,KAAKD,MAAM4D,QAAQtD,OACZ,IAAIuD,EAAAA,WAAW,MAAO,IAAIJ,EAAAA,QAAQ,GAAI,GAAI,IAAKxD,KAAKD,OAAO,GAG3DC,KAAKD,MAAM8D,cAAgB7D,KAAKD,MAAM4D,QAAQ,GAGzDL,EAAOQ,cAAc9D,KAAK+B,QAE1B,IAAIlC,EAAaG,KAAKD,OAElB8B,GAAY7B,KAAK+D,YAAYlC,GAGjC7B,KAAKgE,QACP,CAKQ,WAAAD,CAAYlC,GAClB,IAAKA,EAAY,OAEjB,GAAI7B,KAAKD,MAAMQ,SAAU,CACvB,MAAM0D,EAAajE,KAAKD,MAAMQ,SAAS2D,QACnCD,GAAcA,EAAW5D,OAAS,GACpCL,KAAKmE,UAAUnE,KAAKD,MAAO8B,EAAYoC,EAE3C,CAEA,MAAMG,EAAQpE,KAAKD,MAAMsE,WACzB,IAAA,IAASjE,EAAI,EAAGA,EAAIgE,EAAM/D,OAAQD,IAAK,CACrC,MAAMW,EAAOqD,EAAMhE,GAEfW,EAAKR,UAAU2D,SAAWnD,EAAKR,SAAS2D,QAAQ7D,OAAS,GAC3DL,KAAKmE,UAAUpD,EAAMc,EAAYd,EAAKR,SAAS2D,QAEnD,CACF,CASQ,SAAAC,CAAWpD,EAAoBc,EAAwBoC,GAC7D,GAAKA,EACL,IAAA,IAAS7D,EAAI,EAAGA,EAAI6D,EAAW5D,OAAQD,IAAK,CAC1C,MAAM8C,EAAyBe,EAAW7D,GAE1C,IAAA,MAAWkE,KAAOzC,EAChB,GAAI0C,OAAOC,UAAUC,eAAeC,KAAK7C,EAAYyC,IAC/CA,IAAQpB,EAAOoB,MAA2B,IAApBpB,EAAOyB,SAAmB,CAClD,IAAI7E,EAAmB+B,EAAWqB,EAAOoB,KAEzC,GAAIxE,aAAuB8E,SAAU,CACnC,MAAMC,EAAW,IAAK/E,EAAaE,KAAKD,MAAOgB,EAAMmC,EAAO4B,QAAU,IAItE,GAFID,EAASE,OAAOF,EAASE,QAEzBF,EAASlC,SAAW5B,EAAKiE,oBAAqB,CAChD,MAAMC,EAAgBJ,EAASlC,QAC/B5B,EAAKiE,oBAAoBE,QAAQD,EAASE,KAAKN,GACjD,CAEA7E,KAAK6C,mBAAmBuC,KAAKP,EAC/B,CACF,CAGN,CACF,CAKQ,MAAAb,GACN,IAAIjE,EAAQC,KAAKD,MACjBC,KAAKwC,OAAO6C,cAAc,KACxBtF,EAAMiE,UAEV,CAKA,MAAAsB,GACEtF,KAAKwC,OAAO8C,QACd,CAEA,OAAA3C,GACE3C,KAAKD,MAAM4C,UACX3C,KAAKwC,OAAOG,SACd,CAKA,uBAAO4C,GAAqB,8BAGvB,SAAoB5D,EAA2BC,EAAmBC,EAAyB,CAAA,GAGhG,OAFoB,IAAIH,EAAYC,EAAWC,EAAWC,EAG5D"}
|
|
1
|
+
{"version":3,"file":"babyeditor.tool.umd.js","sources":["../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh } from \"@babylonjs/core\";\r\nimport { IScript } from \"./SceneLoader\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene, private scriptInstanceList: IScript[] = []) {\r\n this.load()\r\n }\r\n\r\n load () {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n // 当对象是外部资源模型时\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene).then(() => {\r\n const findInstance = this.scriptInstanceList.find(instance => instance.node === transNode)\r\n if (findInstance && typeof findInstance.ready === 'function') {\r\n findInstance.ready()\r\n }\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof Mesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, AbstractMesh, Camera, Node, TransformNode } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scriptsMap: ScriptsMap = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true)\r\n this.scene = new Scene(this.engine)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scriptsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n new CustomSystem(this.scene, this.scriptInstanceList)\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap)\r\n\r\n return sceneLoader\r\n}\r\n\r\n/**\r\n * 脚本代码结构\r\n */\r\nexport type IScript = {\r\n /**\r\n * 脚执行时注入的场景对象\r\n */\r\n scene: Scene,\r\n /**\r\n * 当前实例化脚本绑定的对象\r\n */\r\n node: Node | Scene,\r\n /**\r\n * 脚本初始化执行的钩子函数\r\n */\r\n start?: () => void,\r\n /**\r\n * 当有异步动作初始化完成时的钩子函数\r\n */\r\n ready?: () => void,\r\n /**\r\n * 当没帧渲染是执行函数\r\n * @param deltaTime 间隔时间\r\n */\r\n update?: (deltaTime: number) => void,\r\n /**\r\n * 当对象被销毁时执行的函数\r\n */\r\n dispose?: () => void,\r\n}\r\n"],"names":["CustomSystem","constructor","scene","scriptInstanceList","this","load","transNodes","transformNodes","i","length","transNode","metadata","metaData","meshBuilderType","assetModelBuilderOptions","url","LoadAssetModel","then","findInstance","find","instance","node","ready","parentNode","applyMetaData","Node","parent","Mesh","material","doNotSerialize","meshes","lights","skeletons","ImportMeshAsync","forEach","SceneLoader","container","sceneData","scriptsMap","__publicField","canvas","document","createElement","className","width","clientWidth","height","clientHeight","appendChild","engine","Engine","Scene","dispose","onBeforeRenderObservable","add","deltaTime","getDeltaTime","script","update","havokModule","HavokPhysics","camera","enablePhysics","Vector3","HavokPlugin","AppendSceneAsync","cameras","FreeCamera","activeCamera","attachControl","initScripts","render","scriptList","scripts","runScript","nodes","getNodes","key","Object","prototype","hasOwnProperty","call","disabled","Function","values","start","onDisposeObservable","callback","addOnce","bind","push","runRenderLoop","resize","LoadCustomSystem"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Scene, TransformNode } from "@babylonjs/core";
|
|
2
|
+
import { IScript } from "./SceneLoader";
|
|
2
3
|
export declare class CustomSystem {
|
|
3
4
|
scene: Scene;
|
|
4
|
-
|
|
5
|
+
private scriptInstanceList;
|
|
6
|
+
constructor(scene: Scene, scriptInstanceList?: IScript[]);
|
|
5
7
|
load(): void;
|
|
6
8
|
static LoadAssetModel(parentNode: TransformNode, url: string, scene: Scene): Promise<void>;
|
|
7
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomSystem.d.ts","sourceRoot":"","sources":["../../../src/tool/CustomSystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,EAAE,aAAa,EAAwC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomSystem.d.ts","sourceRoot":"","sources":["../../../src/tool/CustomSystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,EAAE,aAAa,EAAwC,MAAM,iBAAiB,CAAC;AAC9G,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,qBAAa,YAAY;IACH,KAAK,EAAE,KAAK;IAAE,OAAO,CAAC,kBAAkB;gBAAxC,KAAK,EAAE,KAAK,EAAU,kBAAkB,GAAE,OAAO,EAAO;IAI5E,IAAI;WAoBS,cAAc,CAAE,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAgBlF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ImportMeshAsync, Node, Mesh } from "@babylonjs/core";
|
|
2
2
|
export class CustomSystem {
|
|
3
|
-
constructor(scene) {
|
|
3
|
+
constructor(scene, scriptInstanceList = []) {
|
|
4
4
|
this.scene = scene;
|
|
5
|
+
this.scriptInstanceList = scriptInstanceList;
|
|
5
6
|
this.load();
|
|
6
7
|
}
|
|
7
8
|
load() {
|
|
@@ -10,8 +11,14 @@ export class CustomSystem {
|
|
|
10
11
|
const transNode = transNodes[i];
|
|
11
12
|
if (transNode.metadata) {
|
|
12
13
|
const metaData = transNode.metadata;
|
|
14
|
+
// 当对象是外部资源模型时
|
|
13
15
|
if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {
|
|
14
|
-
CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene)
|
|
16
|
+
CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene).then(() => {
|
|
17
|
+
const findInstance = this.scriptInstanceList.find(instance => instance.node === transNode);
|
|
18
|
+
if (findInstance && typeof findInstance.ready === 'function') {
|
|
19
|
+
findInstance.ready();
|
|
20
|
+
}
|
|
21
|
+
});
|
|
15
22
|
}
|
|
16
23
|
}
|
|
17
24
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Engine, Scene } from "@babylonjs/core";
|
|
1
|
+
import { Engine, Scene, Node } from "@babylonjs/core";
|
|
2
2
|
import '@babylonjs/materials';
|
|
3
3
|
import '@babylonjs/loaders';
|
|
4
4
|
import '@babylonjs/post-processes';
|
|
@@ -53,7 +53,7 @@ export declare class SceneLoader {
|
|
|
53
53
|
/**
|
|
54
54
|
* 脚本代码列表
|
|
55
55
|
*/
|
|
56
|
-
|
|
56
|
+
scriptsMap: ScriptsMap;
|
|
57
57
|
/**
|
|
58
58
|
* 脚本实例列表
|
|
59
59
|
*/
|
|
@@ -98,9 +98,34 @@ export declare class SceneLoader {
|
|
|
98
98
|
static LoadCustomSystem(): void;
|
|
99
99
|
}
|
|
100
100
|
export declare function loadScene(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap): SceneLoader;
|
|
101
|
+
/**
|
|
102
|
+
* 脚本代码结构
|
|
103
|
+
*/
|
|
101
104
|
export type IScript = {
|
|
105
|
+
/**
|
|
106
|
+
* 脚执行时注入的场景对象
|
|
107
|
+
*/
|
|
108
|
+
scene: Scene;
|
|
109
|
+
/**
|
|
110
|
+
* 当前实例化脚本绑定的对象
|
|
111
|
+
*/
|
|
112
|
+
node: Node | Scene;
|
|
113
|
+
/**
|
|
114
|
+
* 脚本初始化执行的钩子函数
|
|
115
|
+
*/
|
|
102
116
|
start?: () => void;
|
|
117
|
+
/**
|
|
118
|
+
* 当有异步动作初始化完成时的钩子函数
|
|
119
|
+
*/
|
|
120
|
+
ready?: () => void;
|
|
121
|
+
/**
|
|
122
|
+
* 当没帧渲染是执行函数
|
|
123
|
+
* @param deltaTime 间隔时间
|
|
124
|
+
*/
|
|
103
125
|
update?: (deltaTime: number) => void;
|
|
126
|
+
/**
|
|
127
|
+
* 当对象被销毁时执行的函数
|
|
128
|
+
*/
|
|
104
129
|
dispose?: () => void;
|
|
105
130
|
};
|
|
106
131
|
//# sourceMappingURL=SceneLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneLoader.d.ts","sourceRoot":"","sources":["../../../src/tool/SceneLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"SceneLoader.d.ts","sourceRoot":"","sources":["../../../src/tool/SceneLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAsF,IAAI,EAAiB,MAAM,iBAAiB,CAAC;AACzJ,OAAO,sBAAsB,CAAA;AAC7B,OAAO,oBAAoB,CAAA;AAC3B,OAAO,2BAA2B,CAAA;AAClC,OAAO,gCAAgC,CAAA;AAIvC;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAE7B,IAAI,EAAE,QAAQ,CAAC;IAEf,QAAQ,EAAE,OAAO,CAAC;IAElB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAA;CAC/B;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,SAAS,EAAE,WAAW,CAAA;IACtB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAA;IACzB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,SAAS,EAAE,MAAM,CAAK;IACtB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAK;IAC3B;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAgB;IAC1C;;;;;OAKG;gBACS,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU;IAajF;;;;OAIG;IACG,IAAI,CAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU;IA4CtD;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IA4BjB;;OAEG;IACH,OAAO,CAAC,MAAM;IAOd;;OAEG;IACH,MAAM;IAIN,OAAO;IAKP;;OAEG;IACH,MAAM,CAAC,gBAAgB;CACxB;AAED,wBAAgB,SAAS,CAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,UAAe,eAInG;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;IACnB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAA"}
|
|
@@ -24,7 +24,7 @@ export class SceneLoader {
|
|
|
24
24
|
/**
|
|
25
25
|
* 脚本代码列表
|
|
26
26
|
*/
|
|
27
|
-
this.
|
|
27
|
+
this.scriptsMap = {};
|
|
28
28
|
/**
|
|
29
29
|
* 脚本实例列表
|
|
30
30
|
*/
|
|
@@ -49,7 +49,7 @@ export class SceneLoader {
|
|
|
49
49
|
this.scene.dispose();
|
|
50
50
|
}
|
|
51
51
|
if (scriptsMap)
|
|
52
|
-
this.
|
|
52
|
+
this.scriptsMap = scriptsMap;
|
|
53
53
|
this.scene = new Scene(this.engine);
|
|
54
54
|
this.sceneData = sceneData;
|
|
55
55
|
this.scriptInstanceList = [];
|
|
@@ -78,10 +78,10 @@ export class SceneLoader {
|
|
|
78
78
|
console.log('解析并使用场景摄影机');
|
|
79
79
|
}
|
|
80
80
|
camera.attachControl(this.canvas);
|
|
81
|
-
new CustomSystem(this.scene);
|
|
82
81
|
if (scriptsMap)
|
|
83
82
|
this.initScripts(scriptsMap);
|
|
84
83
|
console.log('完成场景初始化');
|
|
84
|
+
new CustomSystem(this.scene, this.scriptInstanceList);
|
|
85
85
|
this.render();
|
|
86
86
|
}
|
|
87
87
|
/**
|