@luminocity/lemonate-engine 15.2.2 → 15.2.3
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/engine.min.js +302 -0
- package/dist/player.zip +302 -0
- package/package.json +6 -2
- package/dist/Builder.js +0 -93
- package/dist/Builder.js.map +0 -1
- package/dist/Canvas.js +0 -109
- package/dist/Canvas.js.map +0 -1
- package/dist/Controllers.js +0 -97
- package/dist/Controllers.js.map +0 -1
- package/dist/EditorScene.js +0 -372
- package/dist/EditorScene.js.map +0 -1
- package/dist/Engine.js +0 -1576
- package/dist/Engine.js.map +0 -1
- package/dist/LoadingManager.js +0 -1195
- package/dist/LoadingManager.js.map +0 -1
- package/dist/LoadingState.js +0 -37
- package/dist/LoadingState.js.map +0 -1
- package/dist/Logger.js +0 -141
- package/dist/Logger.js.map +0 -1
- package/dist/Player.js +0 -470
- package/dist/Player.js.map +0 -1
- package/dist/Preview.js +0 -166
- package/dist/Preview.js.map +0 -1
- package/dist/RenderOptions.js +0 -59
- package/dist/RenderOptions.js.map +0 -1
- package/dist/RenderPassInfo.js +0 -133
- package/dist/RenderPassInfo.js.map +0 -1
- package/dist/RenderView.js +0 -459
- package/dist/RenderView.js.map +0 -1
- package/dist/Renderer.js +0 -1867
- package/dist/Renderer.js.map +0 -1
- package/dist/SceneGraph.js +0 -798
- package/dist/SceneGraph.js.map +0 -1
- package/dist/SceneGraphCollection.js +0 -614
- package/dist/SceneGraphCollection.js.map +0 -1
- package/dist/Shortcuts.js +0 -259
- package/dist/Shortcuts.js.map +0 -1
- package/dist/Tools.js +0 -500
- package/dist/Tools.js.map +0 -1
- package/dist/Variables.js +0 -243
- package/dist/Variables.js.map +0 -1
- package/dist/helpers/ArrowHelper.js +0 -104
- package/dist/helpers/ArrowHelper.js.map +0 -1
- package/dist/helpers/BoxHelper.js +0 -112
- package/dist/helpers/BoxHelper.js.map +0 -1
- package/dist/helpers/CameraHelper.js +0 -237
- package/dist/helpers/CameraHelper.js.map +0 -1
- package/dist/helpers/FaceNormalsHelper.js +0 -85
- package/dist/helpers/FaceNormalsHelper.js.map +0 -1
- package/dist/helpers/MeshHelper.js +0 -92
- package/dist/helpers/MeshHelper.js.map +0 -1
- package/dist/helpers/MultiGridHelper.js +0 -61
- package/dist/helpers/MultiGridHelper.js.map +0 -1
- package/dist/helpers/ParticlesHelper.js +0 -245
- package/dist/helpers/ParticlesHelper.js.map +0 -1
- package/dist/helpers/PointHelper.js +0 -85
- package/dist/helpers/PointHelper.js.map +0 -1
- package/dist/helpers/SphereHelper.js +0 -62
- package/dist/helpers/SphereHelper.js.map +0 -1
- package/dist/helpers/VertexNormalsHelper.js +0 -75
- package/dist/helpers/VertexNormalsHelper.js.map +0 -1
- package/dist/helpers/ViewHelper.js +0 -252
- package/dist/helpers/ViewHelper.js.map +0 -1
- package/dist/helpers/lighthelpers/DirectionalLightHelper.js +0 -136
- package/dist/helpers/lighthelpers/DirectionalLightHelper.js.map +0 -1
- package/dist/helpers/lighthelpers/HemisphereLightHelper.js +0 -124
- package/dist/helpers/lighthelpers/HemisphereLightHelper.js.map +0 -1
- package/dist/helpers/lighthelpers/PointLightHelper.js +0 -133
- package/dist/helpers/lighthelpers/PointLightHelper.js.map +0 -1
- package/dist/helpers/lighthelpers/SpotLightHelper.js +0 -123
- package/dist/helpers/lighthelpers/SpotLightHelper.js.map +0 -1
- package/dist/index.js +0 -40
- package/dist/index.js.map +0 -1
- package/dist/items/AudioCollectionItem.js +0 -230
- package/dist/items/AudioCollectionItem.js.map +0 -1
- package/dist/items/AudioItem.js +0 -75
- package/dist/items/AudioItem.js.map +0 -1
- package/dist/items/BackgroundShaderItem.js +0 -239
- package/dist/items/BackgroundShaderItem.js.map +0 -1
- package/dist/items/CanvasTextureItem.js +0 -194
- package/dist/items/CanvasTextureItem.js.map +0 -1
- package/dist/items/CompositionItem.js +0 -110
- package/dist/items/CompositionItem.js.map +0 -1
- package/dist/items/FontItem.js +0 -135
- package/dist/items/FontItem.js.map +0 -1
- package/dist/items/GaussianSplatsItem.js +0 -103
- package/dist/items/GaussianSplatsItem.js.map +0 -1
- package/dist/items/GridMapItem.js +0 -202
- package/dist/items/GridMapItem.js.map +0 -1
- package/dist/items/ImageItem.js +0 -255
- package/dist/items/ImageItem.js.map +0 -1
- package/dist/items/Item.js +0 -739
- package/dist/items/Item.js.map +0 -1
- package/dist/items/MaterialCollectionItem.js +0 -216
- package/dist/items/MaterialCollectionItem.js.map +0 -1
- package/dist/items/MaterialItem.js +0 -1762
- package/dist/items/MaterialItem.js.map +0 -1
- package/dist/items/MeshCollectionItem.js +0 -258
- package/dist/items/MeshCollectionItem.js.map +0 -1
- package/dist/items/MeshItem.js +0 -274
- package/dist/items/MeshItem.js.map +0 -1
- package/dist/items/ParticlesItem.js +0 -187
- package/dist/items/ParticlesItem.js.map +0 -1
- package/dist/items/PixelShaderItem.js +0 -42
- package/dist/items/PixelShaderItem.js.map +0 -1
- package/dist/items/PointsItem.js +0 -122
- package/dist/items/PointsItem.js.map +0 -1
- package/dist/items/PrefabItem.js +0 -140
- package/dist/items/PrefabItem.js.map +0 -1
- package/dist/items/ProjectItem.js +0 -857
- package/dist/items/ProjectItem.js.map +0 -1
- package/dist/items/SceneItem.js +0 -443
- package/dist/items/SceneItem.js.map +0 -1
- package/dist/items/ScriptItem.js +0 -159
- package/dist/items/ScriptItem.js.map +0 -1
- package/dist/items/VariableSetItem.js +0 -208
- package/dist/items/VariableSetItem.js.map +0 -1
- package/dist/items/VertexShaderItem.js +0 -42
- package/dist/items/VertexShaderItem.js.map +0 -1
- package/dist/items/VideoItem.js +0 -152
- package/dist/items/VideoItem.js.map +0 -1
- package/dist/items/base/ImageOwningItem.js +0 -205
- package/dist/items/base/ImageOwningItem.js.map +0 -1
- package/dist/items/base/MeshBase.js +0 -342
- package/dist/items/base/MeshBase.js.map +0 -1
- package/dist/items/base/ShaderBase.js +0 -115
- package/dist/items/base/ShaderBase.js.map +0 -1
- package/dist/items/helpers/ListEntry.js +0 -113
- package/dist/items/helpers/ListEntry.js.map +0 -1
- package/dist/items/helpers/ListField.js +0 -210
- package/dist/items/helpers/ListField.js.map +0 -1
- package/dist/items/helpers/MappingSetup.js +0 -126
- package/dist/items/helpers/MappingSetup.js.map +0 -1
- package/dist/json/packageVersionInfo.json +0 -6
- package/dist/json/shortcuts.json +0 -37
- package/dist/renderers/ForwardRenderer.js +0 -50
- package/dist/renderers/ForwardRenderer.js.map +0 -1
- package/dist/renderers/RendererBase.js +0 -38
- package/dist/renderers/RendererBase.js.map +0 -1
- package/dist/scenegraph/SgAudio.js +0 -286
- package/dist/scenegraph/SgAudio.js.map +0 -1
- package/dist/scenegraph/SgAudioListener.js +0 -64
- package/dist/scenegraph/SgAudioListener.js.map +0 -1
- package/dist/scenegraph/SgBillboard.js +0 -150
- package/dist/scenegraph/SgBillboard.js.map +0 -1
- package/dist/scenegraph/SgBox.js +0 -54
- package/dist/scenegraph/SgBox.js.map +0 -1
- package/dist/scenegraph/SgCamera.js +0 -219
- package/dist/scenegraph/SgCamera.js.map +0 -1
- package/dist/scenegraph/SgCircleShadow.js +0 -105
- package/dist/scenegraph/SgCircleShadow.js.map +0 -1
- package/dist/scenegraph/SgCone.js +0 -61
- package/dist/scenegraph/SgCone.js.map +0 -1
- package/dist/scenegraph/SgCylinder.js +0 -62
- package/dist/scenegraph/SgCylinder.js.map +0 -1
- package/dist/scenegraph/SgGaussianSplats.js +0 -103
- package/dist/scenegraph/SgGaussianSplats.js.map +0 -1
- package/dist/scenegraph/SgGridMap.js +0 -112
- package/dist/scenegraph/SgGridMap.js.map +0 -1
- package/dist/scenegraph/SgGroup.js +0 -40
- package/dist/scenegraph/SgGroup.js.map +0 -1
- package/dist/scenegraph/SgItem.js +0 -1427
- package/dist/scenegraph/SgItem.js.map +0 -1
- package/dist/scenegraph/SgItemScript.js +0 -117
- package/dist/scenegraph/SgItemScript.js.map +0 -1
- package/dist/scenegraph/SgLightsource.js +0 -319
- package/dist/scenegraph/SgLightsource.js.map +0 -1
- package/dist/scenegraph/SgLod.js +0 -82
- package/dist/scenegraph/SgLod.js.map +0 -1
- package/dist/scenegraph/SgMesh.js +0 -662
- package/dist/scenegraph/SgMesh.js.map +0 -1
- package/dist/scenegraph/SgNavMesh.js +0 -503
- package/dist/scenegraph/SgNavMesh.js.map +0 -1
- package/dist/scenegraph/SgParticles.js +0 -796
- package/dist/scenegraph/SgParticles.js.map +0 -1
- package/dist/scenegraph/SgPhysicsItem.js +0 -806
- package/dist/scenegraph/SgPhysicsItem.js.map +0 -1
- package/dist/scenegraph/SgPhysicsSubItem.js +0 -449
- package/dist/scenegraph/SgPhysicsSubItem.js.map +0 -1
- package/dist/scenegraph/SgPlane.js +0 -47
- package/dist/scenegraph/SgPlane.js.map +0 -1
- package/dist/scenegraph/SgPoints.js +0 -143
- package/dist/scenegraph/SgPoints.js.map +0 -1
- package/dist/scenegraph/SgPositionalAudio.js +0 -93
- package/dist/scenegraph/SgPositionalAudio.js.map +0 -1
- package/dist/scenegraph/SgPrefab.js +0 -153
- package/dist/scenegraph/SgPrefab.js.map +0 -1
- package/dist/scenegraph/SgProceduralGeometryItem.js +0 -146
- package/dist/scenegraph/SgProceduralGeometryItem.js.map +0 -1
- package/dist/scenegraph/SgResourceOwner.js +0 -127
- package/dist/scenegraph/SgResourceOwner.js.map +0 -1
- package/dist/scenegraph/SgRibbon.js +0 -107
- package/dist/scenegraph/SgRibbon.js.map +0 -1
- package/dist/scenegraph/SgRing.js +0 -49
- package/dist/scenegraph/SgRing.js.map +0 -1
- package/dist/scenegraph/SgRoot.js +0 -87
- package/dist/scenegraph/SgRoot.js.map +0 -1
- package/dist/scenegraph/SgScriptedMesh.js +0 -213
- package/dist/scenegraph/SgScriptedMesh.js.map +0 -1
- package/dist/scenegraph/SgSky.js +0 -126
- package/dist/scenegraph/SgSky.js.map +0 -1
- package/dist/scenegraph/SgSphere.js +0 -59
- package/dist/scenegraph/SgSphere.js.map +0 -1
- package/dist/scenegraph/SgText.js +0 -182
- package/dist/scenegraph/SgText.js.map +0 -1
- package/dist/scenegraph/SgTorus.js +0 -48
- package/dist/scenegraph/SgTorus.js.map +0 -1
- package/dist/scenegraph/SgVehicle.js +0 -370
- package/dist/scenegraph/SgVehicle.js.map +0 -1
- package/dist/subsystems/AudioSystem.js +0 -128
- package/dist/subsystems/AudioSystem.js.map +0 -1
- package/dist/subsystems/Billboard.js +0 -190
- package/dist/subsystems/Billboard.js.map +0 -1
- package/dist/subsystems/FontLoader.js +0 -161
- package/dist/subsystems/FontLoader.js.map +0 -1
- package/dist/subsystems/Physics.js +0 -1079
- package/dist/subsystems/Physics.js.map +0 -1
- package/dist/subsystems/Ribbons.js +0 -179
- package/dist/subsystems/Ribbons.js.map +0 -1
- package/dist/subsystems/gridmap/GridMapBuilder.js +0 -430
- package/dist/subsystems/gridmap/GridMapBuilder.js.map +0 -1
- package/dist/subsystems/imgui/ImGui.js +0 -742
- package/dist/subsystems/imgui/ImGui.js.map +0 -1
- package/dist/subsystems/importer/Converter.js +0 -199
- package/dist/subsystems/importer/Converter.js.map +0 -1
- package/dist/subsystems/importer/ImageConverter.js +0 -77
- package/dist/subsystems/importer/ImageConverter.js.map +0 -1
- package/dist/subsystems/importer/Importer.js +0 -381
- package/dist/subsystems/importer/Importer.js.map +0 -1
- package/dist/subsystems/importer/MeshConverter.js +0 -595
- package/dist/subsystems/importer/MeshConverter.js.map +0 -1
- package/dist/subsystems/particlesystem/CurlNoiseTexturePreview.js +0 -127
- package/dist/subsystems/particlesystem/CurlNoiseTexturePreview.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/CircleEmitter.js +0 -135
- package/dist/subsystems/particlesystem/Emitters/CircleEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/ConeEmitter.js +0 -192
- package/dist/subsystems/particlesystem/Emitters/ConeEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/CubeEmitter.js +0 -157
- package/dist/subsystems/particlesystem/Emitters/CubeEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/EdgeEmitter.js +0 -133
- package/dist/subsystems/particlesystem/Emitters/EdgeEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/Emitter.js +0 -107
- package/dist/subsystems/particlesystem/Emitters/Emitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/HemiSphereEmitter.js +0 -142
- package/dist/subsystems/particlesystem/Emitters/HemiSphereEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/MeshEmitter.js +0 -56
- package/dist/subsystems/particlesystem/Emitters/MeshEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/SphereEmitter.js +0 -142
- package/dist/subsystems/particlesystem/Emitters/SphereEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/Emitters/TorusEmitter.js +0 -159
- package/dist/subsystems/particlesystem/Emitters/TorusEmitter.js.map +0 -1
- package/dist/subsystems/particlesystem/ParticleSystem.js +0 -706
- package/dist/subsystems/particlesystem/ParticleSystem.js.map +0 -1
- package/dist/subsystems/particlesystem/Simulation.js +0 -475
- package/dist/subsystems/particlesystem/Simulation.js.map +0 -1
- package/dist/subsystems/particlesystem/Visualization.js +0 -518
- package/dist/subsystems/particlesystem/Visualization.js.map +0 -1
- package/dist/subsystems/particlesystem/shaders/noise/CurlNoiseTexturePreviewShader.js +0 -56
- package/dist/subsystems/particlesystem/shaders/noise/CurlNoiseTexturePreviewShader.js.map +0 -1
- package/dist/subsystems/particlesystem/utils.js +0 -115
- package/dist/subsystems/particlesystem/utils.js.map +0 -1
- package/dist/subsystems/scripting/ScriptEngine.js +0 -1074
- package/dist/subsystems/scripting/ScriptEngine.js.map +0 -1
- package/dist/subsystems/scripting/ScriptRunner.js +0 -153
- package/dist/subsystems/scripting/ScriptRunner.js.map +0 -1
- package/dist/subsystems/scripting/ScriptRuntime.js +0 -244
- package/dist/subsystems/scripting/ScriptRuntime.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtAudio.js +0 -37
- package/dist/subsystems/scripting/runtime/RtAudio.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtBase.js +0 -117
- package/dist/subsystems/scripting/runtime/RtBase.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtCanvas.js +0 -326
- package/dist/subsystems/scripting/runtime/RtCanvas.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtComposer.js +0 -58
- package/dist/subsystems/scripting/runtime/RtComposer.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtConsole.js +0 -51
- package/dist/subsystems/scripting/runtime/RtConsole.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtControllers.js +0 -52
- package/dist/subsystems/scripting/runtime/RtControllers.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtEvents.js +0 -46
- package/dist/subsystems/scripting/runtime/RtEvents.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtImGui.js +0 -410
- package/dist/subsystems/scripting/runtime/RtImGui.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtItem.js +0 -297
- package/dist/subsystems/scripting/runtime/RtItem.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtLoader.js +0 -77
- package/dist/subsystems/scripting/runtime/RtLoader.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtObject.js +0 -34
- package/dist/subsystems/scripting/runtime/RtObject.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtPhysics.js +0 -69
- package/dist/subsystems/scripting/runtime/RtPhysics.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtPointer.js +0 -45
- package/dist/subsystems/scripting/runtime/RtPointer.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtProject.js +0 -66
- package/dist/subsystems/scripting/runtime/RtProject.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtRenderer.js +0 -138
- package/dist/subsystems/scripting/runtime/RtRenderer.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtSceneEntry.js +0 -67
- package/dist/subsystems/scripting/runtime/RtSceneEntry.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtSceneObject.js +0 -666
- package/dist/subsystems/scripting/runtime/RtSceneObject.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtStorage.js +0 -64
- package/dist/subsystems/scripting/runtime/RtStorage.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtSystem.js +0 -85
- package/dist/subsystems/scripting/runtime/RtSystem.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtTools.js +0 -37
- package/dist/subsystems/scripting/runtime/RtTools.js.map +0 -1
- package/dist/subsystems/scripting/runtime/RtVariables.js +0 -57
- package/dist/subsystems/scripting/runtime/RtVariables.js.map +0 -1
- package/dist/subsystems/scripting/runtime/items/RtCanvasTexture.js +0 -101
- package/dist/subsystems/scripting/runtime/items/RtCanvasTexture.js.map +0 -1
- package/dist/subsystems/scripting/runtime/items/RtMaterial.js +0 -34
- package/dist/subsystems/scripting/runtime/items/RtMaterial.js.map +0 -1
- package/dist/subsystems/scripting/runtime/items/RtMesh.js +0 -34
- package/dist/subsystems/scripting/runtime/items/RtMesh.js.map +0 -1
- package/dist/subsystems/scripting/runtime/items/RtTexture.js +0 -34
- package/dist/subsystems/scripting/runtime/items/RtTexture.js.map +0 -1
- package/dist/subsystems/scripting/runtime/items/RtVideo.js +0 -56
- package/dist/subsystems/scripting/runtime/items/RtVideo.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgAudio.js +0 -59
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgAudio.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgCamera.js +0 -134
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgCamera.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgMesh.js +0 -99
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgMesh.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgNavMesh.js +0 -114
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgNavMesh.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgParticles.js +0 -576
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgParticles.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgPositionalAudio.js +0 -56
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgPositionalAudio.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgRibbon.js +0 -42
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgRibbon.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgScriptedMesh.js +0 -65
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgScriptedMesh.js.map +0 -1
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgVehicle.js +0 -60
- package/dist/subsystems/scripting/runtime/sceneobjects/RtSgVehicle.js.map +0 -1
- package/dist/tools/AsyncInterval.js +0 -55
- package/dist/tools/AsyncInterval.js.map +0 -1
- package/dist/tools/Converters.js +0 -41
- package/dist/tools/Converters.js.map +0 -1
- package/dist/tools/DebugTools.js +0 -91
- package/dist/tools/DebugTools.js.map +0 -1
- package/dist/tools/FontTools.js +0 -43
- package/dist/tools/FontTools.js.map +0 -1
- package/dist/tools/FsShader.js +0 -112
- package/dist/tools/FsShader.js.map +0 -1
- package/dist/tools/GeometryTools.js +0 -373
- package/dist/tools/GeometryTools.js.map +0 -1
- package/dist/tools/ItemTools.js +0 -139
- package/dist/tools/ItemTools.js.map +0 -1
- package/dist/tools/MathHelpers.js +0 -125
- package/dist/tools/MathHelpers.js.map +0 -1
- package/dist/tools/Profiler.js +0 -174
- package/dist/tools/Profiler.js.map +0 -1
- package/dist/tools/Random.js +0 -48
- package/dist/tools/Random.js.map +0 -1
- package/dist/tools/RtDebugger.js +0 -84
- package/dist/tools/RtDebugger.js.map +0 -1
- package/dist/tools/StringExtensions.js +0 -72
- package/dist/tools/StringExtensions.js.map +0 -1
- package/dist/tools/TextureTools.js +0 -444
- package/dist/tools/TextureTools.js.map +0 -1
- package/dist/tools/Timer.js +0 -52
- package/dist/tools/Timer.js.map +0 -1
- package/dist/tools/audioVisualizers/WavyAudioVisualizer.js +0 -59
- package/dist/tools/audioVisualizers/WavyAudioVisualizer.js.map +0 -1
- /package/dist/renderers/{forwardrenderer.d.ts → ForwardRenderer.d.ts} +0 -0
- /package/dist/subsystems/imgui/{imgui.d.ts → ImGui.d.ts} +0 -0
- /package/dist/subsystems/importer/{imageconverter.d.ts → ImageConverter.d.ts} +0 -0
- /package/dist/subsystems/scripting/{scriptrunner.d.ts → ScriptRunner.d.ts} +0 -0
- /package/dist/subsystems/scripting/{scriptruntime.d.ts → ScriptRuntime.d.ts} +0 -0
- /package/dist/subsystems/scripting/runtime/{rtAudio.d.ts → RtAudio.d.ts} +0 -0
- /package/dist/subsystems/scripting/runtime/{rtComposer.d.ts → RtComposer.d.ts} +0 -0
- /package/dist/subsystems/scripting/runtime/{rtObject.d.ts → RtObject.d.ts} +0 -0
|
@@ -1,1074 +0,0 @@
|
|
|
1
|
-
// -----------------------------------------------------------------------------------------------------------
|
|
2
|
-
// __ ______ __ __ ______ __ __ ______ ______ ______
|
|
3
|
-
// /\ \ /\ ___\ /\ "-./ \ /\ __ \ /\ "-.\ \ /\ __ \ /\__ _\ /\ ___\
|
|
4
|
-
// \ \ \____ \ \ __\ \ \ \-./\ \ \ \ \/\ \ \ \ \-. \ \ \ __ \ \/_/\ \/ \ \ __\
|
|
5
|
-
// \ \_____\ \ \_____\ \ \_\ \ \_\ \ \_____\ \ \_\\"\_\ \ \_\ \_\ \ \_\ \ \_____\
|
|
6
|
-
// \/_____/ \/_____/ \/_/ \/_/ \/_____/ \/_/ \/_/ \/_/\/_/ \/_/ \/_____/
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// Copyright 2023- Luminocity AG
|
|
10
|
-
//
|
|
11
|
-
// "All your base are belong to us." - Zero Wing (1989)
|
|
12
|
-
//
|
|
13
|
-
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
14
|
-
// and associated documentation files (the “Software”), to deal in the Software without restriction,
|
|
15
|
-
// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
16
|
-
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
17
|
-
// subject to the following conditions:
|
|
18
|
-
//
|
|
19
|
-
// The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
20
|
-
// portions of the Software.
|
|
21
|
-
//
|
|
22
|
-
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
|
23
|
-
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
24
|
-
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
25
|
-
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
26
|
-
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
27
|
-
// -----------------------------------------------------------------------------------------------------------
|
|
28
|
-
import LuaModule from './wasm/lua.browser.js';
|
|
29
|
-
import LuaWasm from './wasm/lua.wasm';
|
|
30
|
-
import * as msgpack from '@msgpack/msgpack';
|
|
31
|
-
import moduleTemplate from './lualibs/moduleTemplate.lua';
|
|
32
|
-
import eventHooksCode from './lualibs/eventhooks.lua';
|
|
33
|
-
import lua_api_coroutine from "./lualibs/api/_coroutine.lua";
|
|
34
|
-
import lua_api_internal from "./lualibs/api/_internal.lua";
|
|
35
|
-
import lua_api_audio from "./lualibs/api/audio.lua";
|
|
36
|
-
import lua_api_canvas from "./lualibs/api/canvas.lua";
|
|
37
|
-
import lua_api_class from "./lualibs/api/class.lua";
|
|
38
|
-
import lua_api_console from "./lualibs/api/console.lua";
|
|
39
|
-
import lua_api_controllers from "./lualibs/api/controllers.lua";
|
|
40
|
-
import lua_api_composer from './lualibs/api/composer.lua';
|
|
41
|
-
import lua_api_data from "./lualibs/api/data.lua";
|
|
42
|
-
import lua_api_data_color from "./lualibs/api/data/color.lua";
|
|
43
|
-
import lua_api_data_list from "./lualibs/api/data/list.lua";
|
|
44
|
-
import lua_api_data_set from "./lualibs/api/data/set.lua";
|
|
45
|
-
import lua_api_datetime from "./lualibs/api/datetime.lua";
|
|
46
|
-
import lua_api_entity from "./lualibs/api/behaviour.lua";
|
|
47
|
-
import lua_api_events from './lualibs/api/events.lua';
|
|
48
|
-
import lua_api_handle from "./lualibs/api/handle.lua";
|
|
49
|
-
import lua_api_imgui from "./lualibs/api/imgui.lua";
|
|
50
|
-
import lua_api_item from './lualibs/api/item.lua';
|
|
51
|
-
import lua_api_items_material from './lualibs/api/items/material.lua';
|
|
52
|
-
import lua_api_items_canvastexture from './lualibs/api/items/canvastexture.lua';
|
|
53
|
-
import lua_api_items_font from './lualibs/api/items/font.lua';
|
|
54
|
-
import lua_api_items_gridmap from './lualibs/api/items/gridmap.lua';
|
|
55
|
-
import lua_api_items_mesh from './lualibs/api/items/mesh.lua';
|
|
56
|
-
import lua_api_items_prefab from './lualibs/api/items/prefab.lua';
|
|
57
|
-
import lua_api_items_texture from './lualibs/api/items/texture.lua';
|
|
58
|
-
import lua_api_items_video from './lualibs/api/items/video.lua';
|
|
59
|
-
import lua_api_json from "./lualibs/api/json.lua";
|
|
60
|
-
import lua_api_json_jsondecoder from "./lualibs/api/json/jsondecoder.lua";
|
|
61
|
-
import lua_api_json_jsonencoder from "./lualibs/api/json/jsonencoder.lua";
|
|
62
|
-
import lua_api_keys from './lualibs/api/keys.lua';
|
|
63
|
-
import lua_api_loader from './lualibs/api/loader.lua';
|
|
64
|
-
import lua_api_math from "./lualibs/api/math.lua";
|
|
65
|
-
import lua_api_math_complex from "./lualibs/api/math/complex.lua";
|
|
66
|
-
import lua_api_math_matrix from "./lualibs/api/math/matrix.lua";
|
|
67
|
-
import lua_api_math_quaternion from "./lualibs/api/math/quaternion.lua";
|
|
68
|
-
import lua_api_math_transform from "./lualibs/api/math/transform.lua";
|
|
69
|
-
import lua_api_math_vector2 from "./lualibs/api/math/vector2.lua";
|
|
70
|
-
import lua_api_math_vector3 from "./lualibs/api/math/vector3.lua";
|
|
71
|
-
import lua_api_math_vector4 from "./lualibs/api/math/vector4.lua";
|
|
72
|
-
import lua_api_msgpack from "./lualibs/api/msgpack.lua";
|
|
73
|
-
import lua_api_object from "./lualibs/api/object.lua";
|
|
74
|
-
import lua_api_physics from "./lualibs/api/physics.lua";
|
|
75
|
-
import lua_api_pointer from "./lualibs/api/pointer.lua";
|
|
76
|
-
import lua_api_project from "./lualibs/api/project.lua";
|
|
77
|
-
import lua_api_promise from "./lualibs/api/promise.lua";
|
|
78
|
-
import lua_api_property from "./lualibs/api/property.lua";
|
|
79
|
-
import lua_api_renderer from "./lualibs/api/renderer.lua";
|
|
80
|
-
import lua_api_sceneentry from "./lualibs/api/sceneentry.lua";
|
|
81
|
-
import lua_api_sceneobject from "./lualibs/api/sceneobject.lua";
|
|
82
|
-
import lua_api_sceneobjects_audio from "./lualibs/api/sceneobjects/audio.lua";
|
|
83
|
-
import lua_api_sceneobjects_audiolistener from "./lualibs/api/sceneobjects/audiolistener.lua";
|
|
84
|
-
import lua_api_sceneobjects_billboard from "./lualibs/api/sceneobjects/billboard.lua";
|
|
85
|
-
import lua_api_sceneobjects_box from "./lualibs/api/sceneobjects/box.lua";
|
|
86
|
-
import lua_api_sceneobjects_camera from "./lualibs/api/sceneobjects/camera.lua";
|
|
87
|
-
import lua_api_sceneobjects_circleshadow from "./lualibs/api/sceneobjects/circleshadow.lua";
|
|
88
|
-
import lua_api_sceneobjects_cone from "./lualibs/api/sceneobjects/cone.lua";
|
|
89
|
-
import lua_api_sceneobjects_cylinder from "./lualibs/api/sceneobjects/cylinder.lua";
|
|
90
|
-
import lua_api_sceneobjects_gaussiansplats from "./lualibs/api/sceneobjects/gaussiansplats.lua";
|
|
91
|
-
import lua_api_sceneobjects_gridmap from "./lualibs/api/sceneobjects/gridmap.lua";
|
|
92
|
-
import lua_api_sceneobjects_group from "./lualibs/api/sceneobjects/group.lua";
|
|
93
|
-
import lua_api_sceneobjects_lightsource from "./lualibs/api/sceneobjects/lightsource.lua";
|
|
94
|
-
import lua_api_sceneobjects_mesh from "./lualibs/api/sceneobjects/mesh.lua";
|
|
95
|
-
import lua_api_sceneobjects_navmesh from "./lualibs/api/sceneobjects/navmesh.lua";
|
|
96
|
-
import lua_api_sceneobjects_plane from "./lualibs/api/sceneobjects/plane.lua";
|
|
97
|
-
import lua_api_sceneobjects_points from "./lualibs/api/sceneobjects/points.lua";
|
|
98
|
-
import lua_api_sceneobjects_positionalaudio from "./lualibs/api/sceneobjects/positionalaudio.lua";
|
|
99
|
-
import lua_api_sceneobjects_prefab from "./lualibs/api/sceneobjects/prefab.lua";
|
|
100
|
-
import lua_api_sceneobjects_ribbon from "./lualibs/api/sceneobjects/ribbon.lua";
|
|
101
|
-
import lua_api_sceneobjects_ring from "./lualibs/api/sceneobjects/ring.lua";
|
|
102
|
-
import lua_api_sceneobjects_scene from "./lualibs/api/sceneobjects/scene.lua";
|
|
103
|
-
import lua_api_sceneobjects_scriptedmesh from './lualibs/api/sceneobjects/scriptedmesh.lua';
|
|
104
|
-
import lua_api_sceneobjects_sky from "./lualibs/api/sceneobjects/sky.lua";
|
|
105
|
-
import lua_api_sceneobjects_sphere from "./lualibs/api/sceneobjects/sphere.lua";
|
|
106
|
-
import lua_api_sceneobjects_text from "./lualibs/api/sceneobjects/text.lua";
|
|
107
|
-
import lua_api_sceneobjects_torus from "./lualibs/api/sceneobjects/torus.lua";
|
|
108
|
-
import lua_api_sceneobjects_vehicle from "./lualibs/api/sceneobjects/vehicle.lua";
|
|
109
|
-
import lua_api_sceneobjects_particles from "./lualibs/api/sceneobjects/particles.lua";
|
|
110
|
-
import lua_api_storage from "./lualibs/api/storage.lua";
|
|
111
|
-
import lua_api_system from "./lualibs/api/system.lua";
|
|
112
|
-
import lua_api_tools from "./lualibs/api/tools.lua";
|
|
113
|
-
import lua_api_variables from "./lualibs/api/variables.lua";
|
|
114
|
-
import { LoaderException } from '@luminocity/lemonate-gateway';
|
|
115
|
-
import { ScriptRuntime } from './ScriptRuntime';
|
|
116
|
-
import tools from "../../Tools.js";
|
|
117
|
-
const SE_DEBUG_LOG = false;
|
|
118
|
-
export class ScriptEngine {
|
|
119
|
-
engine;
|
|
120
|
-
itemRepo;
|
|
121
|
-
lua = undefined;
|
|
122
|
-
initialized = false;
|
|
123
|
-
scriptRunners = new Map();
|
|
124
|
-
scripts = new Map();
|
|
125
|
-
eventListeners = new Map();
|
|
126
|
-
scriptRuntimeData;
|
|
127
|
-
scriptRuntime;
|
|
128
|
-
breakpointsMap = {};
|
|
129
|
-
// Library importing
|
|
130
|
-
// -------------------------------------------------------------------------------------------------
|
|
131
|
-
importedLibsPromises = {}; // stores any promises of importing libs so we don't need to import things twice
|
|
132
|
-
importedLibsMap = {};
|
|
133
|
-
// we lack the scriptId in JS_requireModule, so we keep track of the path<->scriptId pairs here
|
|
134
|
-
importedLibPathMap = {};
|
|
135
|
-
funcExistsMap = {};
|
|
136
|
-
scriptLocOffsets = {};
|
|
137
|
-
moduleTemplateCodeLineOffset = 0;
|
|
138
|
-
promises = new Map();
|
|
139
|
-
libs = {
|
|
140
|
-
"engine/_coroutine": lua_api_coroutine,
|
|
141
|
-
"engine/_internal": lua_api_internal,
|
|
142
|
-
"engine/audio": lua_api_audio,
|
|
143
|
-
"engine/canvas": lua_api_canvas,
|
|
144
|
-
"engine/class": lua_api_class,
|
|
145
|
-
"engine/console": lua_api_console,
|
|
146
|
-
"engine/controllers": lua_api_controllers,
|
|
147
|
-
"engine/composer": lua_api_composer,
|
|
148
|
-
"engine/data": lua_api_data,
|
|
149
|
-
"engine/data/color": lua_api_data_color,
|
|
150
|
-
"engine/data/set": lua_api_data_set,
|
|
151
|
-
"engine/data/list": lua_api_data_list,
|
|
152
|
-
"engine/datetime": lua_api_datetime,
|
|
153
|
-
"engine/entity": lua_api_entity,
|
|
154
|
-
"engine/events": lua_api_events,
|
|
155
|
-
"engine/handle": lua_api_handle,
|
|
156
|
-
"engine/imgui": lua_api_imgui,
|
|
157
|
-
"engine/item": lua_api_item,
|
|
158
|
-
"engine/items/material": lua_api_items_material,
|
|
159
|
-
"engine/items/canvastexture": lua_api_items_canvastexture,
|
|
160
|
-
"engine/items/font": lua_api_items_font,
|
|
161
|
-
"engine/items/gridmap": lua_api_items_gridmap,
|
|
162
|
-
"engine/items/mesh": lua_api_items_mesh,
|
|
163
|
-
"engine/items/prefab": lua_api_items_prefab,
|
|
164
|
-
"engine/items/texture": lua_api_items_texture,
|
|
165
|
-
"engine/items/video": lua_api_items_video,
|
|
166
|
-
"engine/json": lua_api_json,
|
|
167
|
-
"engine/json/jsonencoder": lua_api_json_jsonencoder,
|
|
168
|
-
"engine/json/jsondecoder": lua_api_json_jsondecoder,
|
|
169
|
-
"engine/keys": lua_api_keys,
|
|
170
|
-
"engine/loader": lua_api_loader,
|
|
171
|
-
"engine/math": lua_api_math,
|
|
172
|
-
"engine/math/vector2": lua_api_math_vector2,
|
|
173
|
-
"engine/math/vector3": lua_api_math_vector3,
|
|
174
|
-
"engine/math/vector4": lua_api_math_vector4,
|
|
175
|
-
"engine/math/quaternion": lua_api_math_quaternion,
|
|
176
|
-
"engine/math/transform": lua_api_math_transform,
|
|
177
|
-
"engine/math/matrix": lua_api_math_matrix,
|
|
178
|
-
"engine/math/complex": lua_api_math_complex,
|
|
179
|
-
"engine/msgpack": lua_api_msgpack,
|
|
180
|
-
"engine/object": lua_api_object,
|
|
181
|
-
"engine/physics": lua_api_physics,
|
|
182
|
-
"engine/pointer": lua_api_pointer,
|
|
183
|
-
"engine/project": lua_api_project,
|
|
184
|
-
"engine/promise": lua_api_promise,
|
|
185
|
-
"engine/property": lua_api_property,
|
|
186
|
-
"engine/renderer": lua_api_renderer,
|
|
187
|
-
"engine/sceneentry": lua_api_sceneentry,
|
|
188
|
-
"engine/sceneobject": lua_api_sceneobject,
|
|
189
|
-
"engine/sceneobjects/sgaudio": lua_api_sceneobjects_audio,
|
|
190
|
-
"engine/sceneobjects/sgaudiolistener": lua_api_sceneobjects_audiolistener,
|
|
191
|
-
"engine/sceneobjects/sgbillboard": lua_api_sceneobjects_billboard,
|
|
192
|
-
"engine/sceneobjects/sgbox": lua_api_sceneobjects_box,
|
|
193
|
-
"engine/sceneobjects/sgcamera": lua_api_sceneobjects_camera,
|
|
194
|
-
"engine/sceneobjects/sgcircleshadow": lua_api_sceneobjects_circleshadow,
|
|
195
|
-
"engine/sceneobjects/sgcone": lua_api_sceneobjects_cone,
|
|
196
|
-
"engine/sceneobjects/sgcylinder": lua_api_sceneobjects_cylinder,
|
|
197
|
-
"engine/sceneobjects/sggaussiansplats": lua_api_sceneobjects_gaussiansplats,
|
|
198
|
-
"engine/sceneobjects/sggridmap": lua_api_sceneobjects_gridmap,
|
|
199
|
-
"engine/sceneobjects/sggroup": lua_api_sceneobjects_group,
|
|
200
|
-
"engine/sceneobjects/sglightsource": lua_api_sceneobjects_lightsource,
|
|
201
|
-
"engine/sceneobjects/sgnavmesh": lua_api_sceneobjects_navmesh,
|
|
202
|
-
"engine/sceneobjects/sgmesh": lua_api_sceneobjects_mesh,
|
|
203
|
-
"engine/sceneobjects/sgplane": lua_api_sceneobjects_plane,
|
|
204
|
-
"engine/sceneobjects/sgpoints": lua_api_sceneobjects_points,
|
|
205
|
-
"engine/sceneobjects/sgpositionalaudio": lua_api_sceneobjects_positionalaudio,
|
|
206
|
-
"engine/sceneobjects/sgprefab": lua_api_sceneobjects_prefab,
|
|
207
|
-
"engine/sceneobjects/sgribbon": lua_api_sceneobjects_ribbon,
|
|
208
|
-
"engine/sceneobjects/sgring": lua_api_sceneobjects_ring,
|
|
209
|
-
"engine/sceneobjects/sgscene": lua_api_sceneobjects_scene,
|
|
210
|
-
"engine/sceneobjects/sgscriptedmesh": lua_api_sceneobjects_scriptedmesh,
|
|
211
|
-
"engine/sceneobjects/sgsky": lua_api_sceneobjects_sky,
|
|
212
|
-
"engine/sceneobjects/sgsphere": lua_api_sceneobjects_sphere,
|
|
213
|
-
"engine/sceneobjects/sgtext": lua_api_sceneobjects_text,
|
|
214
|
-
"engine/sceneobjects/sgtorus": lua_api_sceneobjects_torus,
|
|
215
|
-
"engine/sceneobjects/sgvehicle": lua_api_sceneobjects_vehicle,
|
|
216
|
-
"engine/sceneobjects/sgparticles": lua_api_sceneobjects_particles,
|
|
217
|
-
"engine/storage": lua_api_storage,
|
|
218
|
-
"engine/system": lua_api_system,
|
|
219
|
-
"engine/tools": lua_api_tools,
|
|
220
|
-
"engine/variables": lua_api_variables
|
|
221
|
-
};
|
|
222
|
-
api = {};
|
|
223
|
-
constructor(engine) {
|
|
224
|
-
this.engine = engine;
|
|
225
|
-
this.itemRepo = this.engine.itemRepo;
|
|
226
|
-
this.scriptRuntimeData = {
|
|
227
|
-
engine: this.engine,
|
|
228
|
-
scriptEngine: null
|
|
229
|
-
};
|
|
230
|
-
this.scriptRuntimeData.scriptEngine = this;
|
|
231
|
-
this.scriptRuntime = new ScriptRuntime(this.scriptRuntimeData);
|
|
232
|
-
this.moduleTemplateCodeLineOffset = this._calculateModuleTemplateCodeLineOffset();
|
|
233
|
-
this.api.JS_requireModule = (modname) => {
|
|
234
|
-
try {
|
|
235
|
-
const script = this.libs[modname];
|
|
236
|
-
if (script)
|
|
237
|
-
return script;
|
|
238
|
-
const scriptId = this.importedLibPathMap[modname];
|
|
239
|
-
if (!scriptId) {
|
|
240
|
-
console.error(`Could not resolve script path '${modname}' to item Id.`);
|
|
241
|
-
return "";
|
|
242
|
-
}
|
|
243
|
-
const importedScript = this.importedLibsMap[scriptId];
|
|
244
|
-
if (importedScript)
|
|
245
|
-
return importedScript;
|
|
246
|
-
console.error(`Script with Id '${scriptId}' for module '${modname}' not found. Maybe it failed to load previously!`);
|
|
247
|
-
return "";
|
|
248
|
-
}
|
|
249
|
-
catch (err) {
|
|
250
|
-
console.error("Error in JS_requireModule: ", err);
|
|
251
|
-
return "";
|
|
252
|
-
}
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
handlePromise(handle, promise) {
|
|
256
|
-
this.promises.set(handle, { promise: promise, reject: undefined, resolve: undefined });
|
|
257
|
-
promise.then((value) => {
|
|
258
|
-
// check if the promises map is empty. if so, the execution has stopped and we should omit the result
|
|
259
|
-
if (this.promises.size) {
|
|
260
|
-
this.callFunc("__promise", this.packMessage({
|
|
261
|
-
type: "resolved",
|
|
262
|
-
_handle: handle,
|
|
263
|
-
value: value
|
|
264
|
-
}), false);
|
|
265
|
-
}
|
|
266
|
-
this.clearPromise(handle);
|
|
267
|
-
return value;
|
|
268
|
-
}).catch((err) => {
|
|
269
|
-
console.error(err);
|
|
270
|
-
// check if the promises map is empty. if so, the execution has stopped and we should omit the result
|
|
271
|
-
if (this.promises.size) {
|
|
272
|
-
this.callFunc("__promise", this.packMessage({
|
|
273
|
-
type: "rejected",
|
|
274
|
-
_handle: handle,
|
|
275
|
-
error: err.toString()
|
|
276
|
-
}), false);
|
|
277
|
-
}
|
|
278
|
-
this.clearPromise(handle);
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
clearPromise(handle) {
|
|
282
|
-
this.promises.delete(handle);
|
|
283
|
-
}
|
|
284
|
-
message(target, payload, buffers, scriptId) {
|
|
285
|
-
let result;
|
|
286
|
-
result = this.getScriptRuntime().sendMessage(target, payload, buffers, scriptId);
|
|
287
|
-
// in case the function returned a promise, return a handle instead and wait for the promise in JS and trigger
|
|
288
|
-
// Lua with the result later
|
|
289
|
-
if (result instanceof Promise) {
|
|
290
|
-
const handle = tools.createGUID();
|
|
291
|
-
this.handlePromise(handle, result);
|
|
292
|
-
result = handle;
|
|
293
|
-
}
|
|
294
|
-
return result;
|
|
295
|
-
}
|
|
296
|
-
resetPromises() {
|
|
297
|
-
this.promises = new Map();
|
|
298
|
-
}
|
|
299
|
-
_debugLog(msg, ...args) {
|
|
300
|
-
if (!SE_DEBUG_LOG)
|
|
301
|
-
return;
|
|
302
|
-
console.log(`[SE] ${msg}`, ...args);
|
|
303
|
-
}
|
|
304
|
-
_debugErr(err, ...args) {
|
|
305
|
-
if (!SE_DEBUG_LOG)
|
|
306
|
-
return;
|
|
307
|
-
console.error(`[SE] ${err}`, ...args);
|
|
308
|
-
}
|
|
309
|
-
async init() {
|
|
310
|
-
if (this.initialized)
|
|
311
|
-
return;
|
|
312
|
-
const lua = await LuaModule({
|
|
313
|
-
locateFile: () => {
|
|
314
|
-
return LuaWasm;
|
|
315
|
-
},
|
|
316
|
-
print: (msg) => {
|
|
317
|
-
const offsetMsg = this.correctScriptLocs(msg);
|
|
318
|
-
console.log(`[LUA]: ${offsetMsg}`);
|
|
319
|
-
},
|
|
320
|
-
printErr: (error) => {
|
|
321
|
-
const offsetError = this.correctScriptLocs(error);
|
|
322
|
-
//@ts-ignore
|
|
323
|
-
if (console.noTraceError) {
|
|
324
|
-
//@ts-ignore
|
|
325
|
-
console.noTraceError(`[LUA]: ${offsetError}`);
|
|
326
|
-
}
|
|
327
|
-
else
|
|
328
|
-
console.log(`[LUA ERROR]: ${offsetError}`);
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
for (const func in this.api) {
|
|
332
|
-
lua[func] = this.api[func];
|
|
333
|
-
}
|
|
334
|
-
this.lua = lua;
|
|
335
|
-
this.resetScriptEngineState();
|
|
336
|
-
console.log("Scripting initialized");
|
|
337
|
-
this.initialized = true;
|
|
338
|
-
//this.doPerformanceTests();
|
|
339
|
-
return lua;
|
|
340
|
-
}
|
|
341
|
-
doPerformanceTests() {
|
|
342
|
-
/*
|
|
343
|
-
setInterval(() => {
|
|
344
|
-
console.log("WASM memory size:", lua.HEAPU8?.buffer.byteLength / 1024, "KB");
|
|
345
|
-
}, 1000);
|
|
346
|
-
*/
|
|
347
|
-
/*
|
|
348
|
-
setInterval(() => {
|
|
349
|
-
const time = Date.now();
|
|
350
|
-
queueMicrotask(() => {
|
|
351
|
-
const interval = Date.now() - time;
|
|
352
|
-
console.log("Time to run microtask: " + interval);
|
|
353
|
-
});
|
|
354
|
-
}, 1000);
|
|
355
|
-
*/
|
|
356
|
-
/*
|
|
357
|
-
setInterval(() => {
|
|
358
|
-
this.callFunc("__testmemory");
|
|
359
|
-
}, 1000);
|
|
360
|
-
*/
|
|
361
|
-
/*
|
|
362
|
-
setTimeout(() => {
|
|
363
|
-
this.callFunc("__testperformance");
|
|
364
|
-
}, 1000);
|
|
365
|
-
*/
|
|
366
|
-
{
|
|
367
|
-
const startTime = Date.now();
|
|
368
|
-
let calls = 0;
|
|
369
|
-
while (Date.now() < startTime + 1000) {
|
|
370
|
-
this.callFunc("__testperformance");
|
|
371
|
-
calls++;
|
|
372
|
-
}
|
|
373
|
-
console.log(`Lua Performance Test: ${calls} function calls were made.`);
|
|
374
|
-
}
|
|
375
|
-
{
|
|
376
|
-
const scriptItemId = "testId";
|
|
377
|
-
let result = this.lua.scriptitem_create(scriptItemId, "local Pointer = require 'engine/pointer'\n" +
|
|
378
|
-
"local e = {}\n" +
|
|
379
|
-
"function e:new()\n" +
|
|
380
|
-
" return self\n" +
|
|
381
|
-
"end\n" +
|
|
382
|
-
"function e:testMethod()\n" +
|
|
383
|
-
" Pointer.isLocked()\n" +
|
|
384
|
-
"end\n" +
|
|
385
|
-
"return e", 0, "testscript");
|
|
386
|
-
if (result !== 0) {
|
|
387
|
-
throw new Error("Script item could not be created!");
|
|
388
|
-
}
|
|
389
|
-
const scriptId = this.lua.script_create();
|
|
390
|
-
result = this.lua.script_load(scriptId, scriptItemId);
|
|
391
|
-
if (result !== 0) {
|
|
392
|
-
throw new Error("Script could not be created!");
|
|
393
|
-
}
|
|
394
|
-
const startTime = Date.now();
|
|
395
|
-
let calls = 0;
|
|
396
|
-
while (Date.now() < startTime + 1000) {
|
|
397
|
-
this.callMethod(scriptId, "testMethod");
|
|
398
|
-
calls++;
|
|
399
|
-
}
|
|
400
|
-
console.log(`Lua Performance Test: ${calls} method calls were made.`);
|
|
401
|
-
this.lua.script_delete(scriptId);
|
|
402
|
-
this.lua.scriptitem_delete(scriptItemId);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
_createBuffer(size) {
|
|
406
|
-
const ptr = this.lua.buffer_create(size);
|
|
407
|
-
return { ptr: ptr, array: new Uint8Array(this.lua.HEAPU8.buffer, ptr, size), size: size };
|
|
408
|
-
}
|
|
409
|
-
_freeBuffer(buffer) {
|
|
410
|
-
if (buffer && buffer.ptr) {
|
|
411
|
-
this.lua.buffer_free(buffer.ptr);
|
|
412
|
-
buffer.ptr = null;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
getScriptRuntime() {
|
|
416
|
-
return this.scriptRuntime;
|
|
417
|
-
}
|
|
418
|
-
getScriptRuntimeData() {
|
|
419
|
-
return this.scriptRuntimeData;
|
|
420
|
-
}
|
|
421
|
-
resetScriptEngineState() {
|
|
422
|
-
this.lua.script_engine_shutdown();
|
|
423
|
-
if (this.lua.script_engine_init(eventHooksCode) !== 0)
|
|
424
|
-
throw new Error("Script engine could not create a state!");
|
|
425
|
-
}
|
|
426
|
-
tick(deltaTimeMs) {
|
|
427
|
-
const payload = this.packMessage(deltaTimeMs);
|
|
428
|
-
return this.callFunc("__tick", payload);
|
|
429
|
-
}
|
|
430
|
-
packMessage(data) {
|
|
431
|
-
return msgpack.encode(data);
|
|
432
|
-
}
|
|
433
|
-
unpackMessage(data) {
|
|
434
|
-
return msgpack.decode(data);
|
|
435
|
-
}
|
|
436
|
-
reset() {
|
|
437
|
-
this.eventListeners.clear();
|
|
438
|
-
// This will clear any allocated buffers from the script engine
|
|
439
|
-
this.lua.script_engine_clear();
|
|
440
|
-
// make sure we clear all imports to force Lua to fetch the code again. it might have changed
|
|
441
|
-
this.lua.script_engine_clear_imports();
|
|
442
|
-
// dispose any objects the runtime might hold
|
|
443
|
-
this.scriptRuntime.dispose();
|
|
444
|
-
// clear all promises so no jumps into code will be made
|
|
445
|
-
this.resetPromises();
|
|
446
|
-
// dispose behaviours and initialize
|
|
447
|
-
this.callFunc("__clearBehaviours");
|
|
448
|
-
this.callFunc("__init");
|
|
449
|
-
}
|
|
450
|
-
async waitForLua() {
|
|
451
|
-
const _this = this;
|
|
452
|
-
return new Promise((resolve, reject) => {
|
|
453
|
-
if (_this.initialized)
|
|
454
|
-
resolve();
|
|
455
|
-
const handle = setInterval(function () {
|
|
456
|
-
if (_this.initialized) {
|
|
457
|
-
clearInterval(handle);
|
|
458
|
-
resolve();
|
|
459
|
-
}
|
|
460
|
-
}, 100);
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
destroy() {
|
|
464
|
-
if (!this.initialized)
|
|
465
|
-
return;
|
|
466
|
-
this.lua.script_engine_shutdown();
|
|
467
|
-
this.initialized = false;
|
|
468
|
-
this.lua = null;
|
|
469
|
-
}
|
|
470
|
-
debuggerEnable() {
|
|
471
|
-
this.lua.debugger_enable();
|
|
472
|
-
}
|
|
473
|
-
debuggerDisable() {
|
|
474
|
-
this.lua.debugger_disable();
|
|
475
|
-
}
|
|
476
|
-
debuggerContinue() {
|
|
477
|
-
this.engine.profiler.logCall('LUA debugger continue', () => {
|
|
478
|
-
try {
|
|
479
|
-
this.engine.player.resume(true);
|
|
480
|
-
const result = this.lua.debugger_continue();
|
|
481
|
-
this.handleCallResult(result);
|
|
482
|
-
}
|
|
483
|
-
catch (err) {
|
|
484
|
-
console.error(`ScriptEngine debugger continue error: `, err);
|
|
485
|
-
}
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
debuggerStepOver() {
|
|
489
|
-
this.engine.profiler.logCall('LUA debugger step over', () => {
|
|
490
|
-
try {
|
|
491
|
-
this.engine.player.resume(true);
|
|
492
|
-
const result = this.lua.debugger_step_over();
|
|
493
|
-
this.handleCallResult(result);
|
|
494
|
-
}
|
|
495
|
-
catch (err) {
|
|
496
|
-
console.error(`ScriptEngine debugger continue error: `, err);
|
|
497
|
-
}
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
debuggerStepInto() {
|
|
501
|
-
this.engine.profiler.logCall('LUA debugger step into', () => {
|
|
502
|
-
try {
|
|
503
|
-
this.engine.player.resume(true);
|
|
504
|
-
const result = this.lua.debugger_step_into();
|
|
505
|
-
this.handleCallResult(result);
|
|
506
|
-
}
|
|
507
|
-
catch (err) {
|
|
508
|
-
console.error(`ScriptEngine debugger step into error: `, err);
|
|
509
|
-
}
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
debuggerCaptureLocals(path, levels) {
|
|
513
|
-
const locals = this.lua.debugger_capture_locals(path || "", levels || 1);
|
|
514
|
-
this.engine.eventBus.$emit(path ? "player:localsPathed" : "player:localsGlobal", locals);
|
|
515
|
-
return locals;
|
|
516
|
-
}
|
|
517
|
-
debuggerCaptureUpvals(path, levels) {
|
|
518
|
-
const upvals = this.lua.debugger_capture_upvals(path || "", levels || 1);
|
|
519
|
-
this.engine.eventBus.$emit(path ? "player:upvalsPathed" : "player:upvalsGlobal", upvals);
|
|
520
|
-
return upvals;
|
|
521
|
-
}
|
|
522
|
-
debuggerCaptureTraceback() {
|
|
523
|
-
try {
|
|
524
|
-
return this.lua.debugger_capture_traceback() || "";
|
|
525
|
-
}
|
|
526
|
-
catch (err) {
|
|
527
|
-
console.error(err);
|
|
528
|
-
return null;
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
delete(scriptId) {
|
|
532
|
-
this.lua.script_delete(scriptId);
|
|
533
|
-
this.scriptRunners.delete(scriptId);
|
|
534
|
-
for (const listenersMap of this.eventListeners.values()) {
|
|
535
|
-
const listenerIdsToDelete = [];
|
|
536
|
-
// find all listener IDs that belong to the script being deleted
|
|
537
|
-
for (const [listenerId, listenerData] of listenersMap.entries()) {
|
|
538
|
-
if (listenerData.scriptId === scriptId) {
|
|
539
|
-
listenerIdsToDelete.push(listenerId);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
for (const listenerId of listenerIdsToDelete) {
|
|
543
|
-
listenersMap.delete(listenerId);
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
functionExists(scriptId, modname) {
|
|
548
|
-
if (!this.funcExistsMap[scriptId]) {
|
|
549
|
-
this.funcExistsMap[scriptId] = {};
|
|
550
|
-
}
|
|
551
|
-
let exists = this.funcExistsMap[scriptId][modname];
|
|
552
|
-
if (exists === undefined) {
|
|
553
|
-
exists = this.lua.script_function_exists(scriptId, modname);
|
|
554
|
-
this.funcExistsMap[scriptId][modname] = exists;
|
|
555
|
-
}
|
|
556
|
-
return exists;
|
|
557
|
-
}
|
|
558
|
-
methodExists(scriptId, modname) {
|
|
559
|
-
if (!this.funcExistsMap[scriptId]) {
|
|
560
|
-
this.funcExistsMap[scriptId] = {};
|
|
561
|
-
}
|
|
562
|
-
let exists = this.funcExistsMap[scriptId][modname];
|
|
563
|
-
if (exists === undefined) {
|
|
564
|
-
exists = this.lua.script_method_exists(scriptId, modname);
|
|
565
|
-
this.funcExistsMap[scriptId][modname] = exists;
|
|
566
|
-
}
|
|
567
|
-
return exists;
|
|
568
|
-
}
|
|
569
|
-
_payloadToBuffer(payload = undefined) {
|
|
570
|
-
if (payload) {
|
|
571
|
-
const buffer = this._createBuffer(payload.length);
|
|
572
|
-
for (let i = 0; i < payload.length; i++) {
|
|
573
|
-
buffer.array[i] = payload[i];
|
|
574
|
-
}
|
|
575
|
-
return buffer;
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
return { ptr: null, array: undefined, size: 0 };
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
getStackDepth() {
|
|
582
|
-
try {
|
|
583
|
-
throw new Error();
|
|
584
|
-
}
|
|
585
|
-
catch (e) {
|
|
586
|
-
return e.stack.split("\n").length;
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
async handleCallResult(result) {
|
|
590
|
-
if (!result)
|
|
591
|
-
return;
|
|
592
|
-
let buffer;
|
|
593
|
-
try {
|
|
594
|
-
while (result) {
|
|
595
|
-
switch (result.type) {
|
|
596
|
-
case 'call': {
|
|
597
|
-
let retmsg;
|
|
598
|
-
this.engine.profiler.logCall(result.function, () => {
|
|
599
|
-
let payload;
|
|
600
|
-
if (result.payload) {
|
|
601
|
-
payload = this.unpackMessage(result.payload);
|
|
602
|
-
}
|
|
603
|
-
try {
|
|
604
|
-
const ret = this.message(result.function, payload, result.buffers, result.scriptId);
|
|
605
|
-
retmsg = this.packMessage(ret);
|
|
606
|
-
}
|
|
607
|
-
catch (err) {
|
|
608
|
-
console.error(`Error calling '${result.function}' from Lua: `, err);
|
|
609
|
-
}
|
|
610
|
-
});
|
|
611
|
-
buffer = this._payloadToBuffer(retmsg);
|
|
612
|
-
result = this.lua.script_engine_resume(result.threadRef, buffer.ptr, buffer.size);
|
|
613
|
-
this._freeBuffer(buffer);
|
|
614
|
-
buffer = null;
|
|
615
|
-
break;
|
|
616
|
-
}
|
|
617
|
-
case 'promise': {
|
|
618
|
-
const promiseEntry = { promise: undefined, resolve: undefined, reject: undefined };
|
|
619
|
-
// we have got a new promise, which is nothing but a nested coroutine. Resume it and handle its
|
|
620
|
-
// result separately until it is finished.
|
|
621
|
-
const executorPromise = new Promise((resolve, reject) => {
|
|
622
|
-
try {
|
|
623
|
-
// This inner promise is the actual promise that is now awaitable. The outer one is just for fully executing
|
|
624
|
-
// the executor function before continuing
|
|
625
|
-
promiseEntry.promise = new Promise((resolve, reject) => {
|
|
626
|
-
promiseEntry.resolve = resolve;
|
|
627
|
-
promiseEntry.reject = reject;
|
|
628
|
-
});
|
|
629
|
-
this.promises.set(result.handle, promiseEntry);
|
|
630
|
-
// now execute the executor function
|
|
631
|
-
const promiseResult = this.lua.script_engine_resume(result.promiseThreadRef, null, 0);
|
|
632
|
-
this.handleCallResult(promiseResult).then(resolve).catch(reject);
|
|
633
|
-
}
|
|
634
|
-
catch (err) {
|
|
635
|
-
reject(err);
|
|
636
|
-
}
|
|
637
|
-
});
|
|
638
|
-
try {
|
|
639
|
-
await executorPromise;
|
|
640
|
-
}
|
|
641
|
-
catch (err) {
|
|
642
|
-
console.error("Awaiting lua promise executor errored: ", err);
|
|
643
|
-
}
|
|
644
|
-
// Promise has finished, now resume the actual thread again
|
|
645
|
-
result = this.lua.script_engine_resume(result.threadRef, null, 0);
|
|
646
|
-
break;
|
|
647
|
-
}
|
|
648
|
-
case 'promiseDone': {
|
|
649
|
-
const promiseEntry = this.promises.get(result.handle);
|
|
650
|
-
if (promiseEntry?.resolve) {
|
|
651
|
-
promiseEntry.resolve();
|
|
652
|
-
}
|
|
653
|
-
else {
|
|
654
|
-
console.warn("Got promise result but promise could not be found: ", result.handle);
|
|
655
|
-
}
|
|
656
|
-
result = this.lua.script_engine_resume(result.threadRef, null, 0);
|
|
657
|
-
break;
|
|
658
|
-
}
|
|
659
|
-
case 'await': {
|
|
660
|
-
const promiseEntry = this.promises.get(result.handle);
|
|
661
|
-
if (promiseEntry) {
|
|
662
|
-
await promiseEntry.promise;
|
|
663
|
-
result = this.lua.script_engine_resume(result.threadRef, null, 0);
|
|
664
|
-
}
|
|
665
|
-
else {
|
|
666
|
-
// promise does not exist. resume anyway!
|
|
667
|
-
console.warn("Promise to await not found: ", result.handle);
|
|
668
|
-
result = this.lua.script_engine_resume(result.threadRef, null, 0);
|
|
669
|
-
}
|
|
670
|
-
break;
|
|
671
|
-
}
|
|
672
|
-
case 'error': {
|
|
673
|
-
const offsetError = this.correctScriptLocs(result.msg);
|
|
674
|
-
// @ts-ignore
|
|
675
|
-
if (console.noTraceError) {
|
|
676
|
-
// @ts-ignore
|
|
677
|
-
console.noTraceError(`[LUA]: ${offsetError}`);
|
|
678
|
-
}
|
|
679
|
-
else
|
|
680
|
-
console.log(`[LUA ERROR]: ${offsetError}`);
|
|
681
|
-
return;
|
|
682
|
-
}
|
|
683
|
-
case 'breakpoint': {
|
|
684
|
-
this.engine.player.pause(true);
|
|
685
|
-
this.engine.eventBus.$emit("debugger:break", {
|
|
686
|
-
item: result.itemId,
|
|
687
|
-
line: result.line
|
|
688
|
-
});
|
|
689
|
-
return;
|
|
690
|
-
}
|
|
691
|
-
default:
|
|
692
|
-
// all okay, just return
|
|
693
|
-
return;
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
catch (err) {
|
|
698
|
-
console.error("Error in handleResult: ", err);
|
|
699
|
-
return null;
|
|
700
|
-
}
|
|
701
|
-
finally {
|
|
702
|
-
this._freeBuffer(buffer);
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
async callFunc(name, payload = undefined, onMainThread = false) {
|
|
706
|
-
return this.engine.profiler.logCall(`LUA hook:${name}`, async () => {
|
|
707
|
-
let buffer;
|
|
708
|
-
try {
|
|
709
|
-
buffer = this._payloadToBuffer(payload);
|
|
710
|
-
const result = this.lua.script_engine_callfunc(name, buffer.ptr, buffer.size, !!onMainThread);
|
|
711
|
-
await this.handleCallResult(result);
|
|
712
|
-
}
|
|
713
|
-
catch (err) {
|
|
714
|
-
console.error(`ScriptEngine call hook '${name}'. Error: `, err);
|
|
715
|
-
}
|
|
716
|
-
finally {
|
|
717
|
-
this._freeBuffer(buffer);
|
|
718
|
-
}
|
|
719
|
-
});
|
|
720
|
-
}
|
|
721
|
-
async callFunction(scriptId, name, payload = undefined) {
|
|
722
|
-
return this.engine.profiler.logCall(`LUA func:${name}`, async () => {
|
|
723
|
-
let buffer;
|
|
724
|
-
try {
|
|
725
|
-
buffer = this._payloadToBuffer(payload);
|
|
726
|
-
const result = this.lua.script_function_call(scriptId, name, buffer.ptr, buffer.size);
|
|
727
|
-
await this.handleCallResult(result);
|
|
728
|
-
}
|
|
729
|
-
catch (err) {
|
|
730
|
-
console.error(`ScriptEngine call function '${name}' on script '${scriptId}'. Error: `, err);
|
|
731
|
-
}
|
|
732
|
-
finally {
|
|
733
|
-
this._freeBuffer(buffer);
|
|
734
|
-
}
|
|
735
|
-
});
|
|
736
|
-
}
|
|
737
|
-
async callFunctionWithObject(scriptId, name, payload = undefined) {
|
|
738
|
-
return this.engine.profiler.logCall(`LUA func+obj:${name}`, async () => {
|
|
739
|
-
let buffer;
|
|
740
|
-
try {
|
|
741
|
-
buffer = this._payloadToBuffer(payload);
|
|
742
|
-
const result = this.lua.script_function_call_with_object(scriptId, name, buffer.ptr, buffer.size);
|
|
743
|
-
await this.handleCallResult(result);
|
|
744
|
-
}
|
|
745
|
-
catch (err) {
|
|
746
|
-
console.error(`ScriptEngine call function '${name}' on script '${scriptId}' with object. Error: `, err);
|
|
747
|
-
}
|
|
748
|
-
finally {
|
|
749
|
-
this._freeBuffer(buffer);
|
|
750
|
-
}
|
|
751
|
-
});
|
|
752
|
-
}
|
|
753
|
-
async callMethod(scriptId, name, payload = undefined) {
|
|
754
|
-
return this.engine.profiler.logCall(`LUA method:${name}`, async () => {
|
|
755
|
-
let buffer;
|
|
756
|
-
try {
|
|
757
|
-
buffer = this._payloadToBuffer(payload);
|
|
758
|
-
const result = this.lua.script_method_call(scriptId, name, buffer.ptr, buffer.size);
|
|
759
|
-
await this.handleCallResult(result);
|
|
760
|
-
}
|
|
761
|
-
catch (err) {
|
|
762
|
-
console.error(`ScriptEngine call method '${name}' on script '${scriptId}'. Error: `, err);
|
|
763
|
-
}
|
|
764
|
-
finally {
|
|
765
|
-
this._freeBuffer(buffer);
|
|
766
|
-
}
|
|
767
|
-
});
|
|
768
|
-
}
|
|
769
|
-
getBreakpoints(scriptItemId) {
|
|
770
|
-
return this.breakpointsMap[scriptItemId];
|
|
771
|
-
}
|
|
772
|
-
toggleBreakpoint(scriptItemId, line) {
|
|
773
|
-
if (!this.breakpointsMap[scriptItemId]) {
|
|
774
|
-
this.breakpointsMap[scriptItemId] = {};
|
|
775
|
-
}
|
|
776
|
-
if (this.breakpointsMap[scriptItemId][line]) {
|
|
777
|
-
this.breakpointsMap[scriptItemId][line] = false;
|
|
778
|
-
this.lua.scriptitem_clear_breakpoint(scriptItemId, line);
|
|
779
|
-
}
|
|
780
|
-
else {
|
|
781
|
-
this.breakpointsMap[scriptItemId][line] = true;
|
|
782
|
-
this.lua.scriptitem_set_breakpoint(scriptItemId, line);
|
|
783
|
-
}
|
|
784
|
-
return this.breakpointsMap[scriptItemId][line];
|
|
785
|
-
}
|
|
786
|
-
async createScript(scriptItem) {
|
|
787
|
-
await this.waitForLua();
|
|
788
|
-
const scriptItemId = scriptItem.getId();
|
|
789
|
-
const scriptItemName = scriptItem.getName();
|
|
790
|
-
const scriptItemCode = scriptItem.getCode();
|
|
791
|
-
const injectedFields = scriptItem.getPublicFields();
|
|
792
|
-
await this._parseAndLoadImportedLibs(scriptItemCode, scriptItemId, scriptItemName);
|
|
793
|
-
const { preparedCode, breakpointsOffset } = this._prepareCode(scriptItemCode, scriptItemId, injectedFields);
|
|
794
|
-
const result = this.lua.scriptitem_create(scriptItemId, preparedCode, breakpointsOffset, scriptItemName);
|
|
795
|
-
if (result !== 0) {
|
|
796
|
-
console.error("Could not create script: " + scriptItemId);
|
|
797
|
-
return;
|
|
798
|
-
}
|
|
799
|
-
//console.log(`Performance Test after loading ${scriptItemName}`);
|
|
800
|
-
//this.doPerformanceTests();
|
|
801
|
-
this.funcExistsMap[scriptItemId] = new Map();
|
|
802
|
-
this.scripts.set(scriptItemId, true);
|
|
803
|
-
this.scriptLocOffsets[scriptItemName] = breakpointsOffset;
|
|
804
|
-
}
|
|
805
|
-
async updateScript(scriptItem) {
|
|
806
|
-
const scriptItemId = scriptItem.getId();
|
|
807
|
-
const scriptItemName = scriptItem.getName();
|
|
808
|
-
const scriptItemCode = scriptItem.getCode();
|
|
809
|
-
const injectedFields = scriptItem.getPublicFields();
|
|
810
|
-
await this._parseAndLoadImportedLibs(scriptItemCode, scriptItemId, scriptItemName);
|
|
811
|
-
const { preparedCode, breakpointsOffset } = this._prepareCode(scriptItemCode, scriptItemId, injectedFields);
|
|
812
|
-
const result = this.lua.scriptitem_update(scriptItemId, preparedCode, breakpointsOffset);
|
|
813
|
-
if (result !== 0) {
|
|
814
|
-
console.error("Could not update script: " + scriptItemId);
|
|
815
|
-
}
|
|
816
|
-
//console.log(`Performance Test after loading ${scriptItemName}`);
|
|
817
|
-
//this.doPerformanceTests();
|
|
818
|
-
this.funcExistsMap[scriptItemId] = new Map();
|
|
819
|
-
this.scriptLocOffsets[scriptItemName] = breakpointsOffset - 1;
|
|
820
|
-
}
|
|
821
|
-
deleteScript(scriptItem) {
|
|
822
|
-
if (!this.initialized)
|
|
823
|
-
return;
|
|
824
|
-
const id = scriptItem.getId();
|
|
825
|
-
const name = scriptItem.getName();
|
|
826
|
-
this.lua.scriptitem_delete(id);
|
|
827
|
-
this.scripts.delete(id);
|
|
828
|
-
delete this.scriptLocOffsets[name];
|
|
829
|
-
}
|
|
830
|
-
async create(scriptRunner) {
|
|
831
|
-
const scriptItemId = scriptRunner.getScriptItemId();
|
|
832
|
-
const scriptItemName = scriptRunner.getScriptItemName();
|
|
833
|
-
if (!this.scripts.has(scriptItemId)) {
|
|
834
|
-
throw "Script not found: " + scriptItemId;
|
|
835
|
-
}
|
|
836
|
-
const scriptId = this.lua.script_create();
|
|
837
|
-
this.scriptRunners.set(scriptId, scriptRunner);
|
|
838
|
-
const result = this.lua.script_load(scriptId, scriptItemId);
|
|
839
|
-
if (result !== 0) {
|
|
840
|
-
throw "Could not load script";
|
|
841
|
-
}
|
|
842
|
-
await this._injectValues(scriptId, scriptItemName, scriptRunner);
|
|
843
|
-
return scriptId;
|
|
844
|
-
}
|
|
845
|
-
async _parseAndLoadImportedLibs(code, scriptItemId, scriptItemName, level = 1) {
|
|
846
|
-
level = level || 1;
|
|
847
|
-
const padding = "".padEnd(level * 2, " ");
|
|
848
|
-
// get all import statement paths in double and single quotes
|
|
849
|
-
// ignore commented import statements
|
|
850
|
-
const importRegExp = /^(?!\s*--)\s*(?:(?:local\s+)?\w+\s*=\s*)?import\s*\(\s*['"]([^'"]+)['"]\s*\)/gm;
|
|
851
|
-
const imports = [];
|
|
852
|
-
let match;
|
|
853
|
-
while ((match = importRegExp.exec(code)) !== null) {
|
|
854
|
-
imports.push(match[1]);
|
|
855
|
-
}
|
|
856
|
-
if (imports.length)
|
|
857
|
-
this._debugLog(`${padding}[${scriptItemName}] Imported libs from here: [${imports.join(', ')}]`);
|
|
858
|
-
else
|
|
859
|
-
this._debugLog(`${padding}[${scriptItemName}] No libs imported from here.`);
|
|
860
|
-
const promises = imports.map(async (path) => {
|
|
861
|
-
try {
|
|
862
|
-
this._debugLog(`${padding} - [${scriptItemName}] Importing script: ${path}`);
|
|
863
|
-
const { item, script } = await this._importLib(scriptItemId, path, scriptItemName);
|
|
864
|
-
const code = script.getCode();
|
|
865
|
-
const key = `#${scriptItemId}#${path}`;
|
|
866
|
-
this._debugLog(`${padding} - [${scriptItemName}] Preparing code: ${path}`);
|
|
867
|
-
const preparedCode = this._prepareCode(code, item._id).preparedCode;
|
|
868
|
-
this.importedLibPathMap[key] = item._id;
|
|
869
|
-
this.importedLibsMap[item._id] = preparedCode;
|
|
870
|
-
await this._parseAndLoadImportedLibs(code, item._id, item.name, level + 1);
|
|
871
|
-
}
|
|
872
|
-
catch {
|
|
873
|
-
this._debugErr(`${padding} - [${scriptItemName}] Failed to load import script: ${path}`);
|
|
874
|
-
}
|
|
875
|
-
});
|
|
876
|
-
await Promise.all(promises);
|
|
877
|
-
}
|
|
878
|
-
async _importLib(scriptItemId, path, scriptItemName) {
|
|
879
|
-
const key = `#${scriptItemId}#${path}`;
|
|
880
|
-
// make sure we won't load things twice. If we're already trying to load a script item or
|
|
881
|
-
// finished loading it, just grab it from here.
|
|
882
|
-
if (this.importedLibsPromises[key])
|
|
883
|
-
return this.importedLibsPromises[key];
|
|
884
|
-
const promise = new Promise(async (resolve, reject) => {
|
|
885
|
-
let item;
|
|
886
|
-
try {
|
|
887
|
-
item = await this.itemRepo.loadItemByRelativePath(scriptItemId, path, { recursive: true });
|
|
888
|
-
}
|
|
889
|
-
catch (err) {
|
|
890
|
-
console.error(err);
|
|
891
|
-
}
|
|
892
|
-
if (!item) {
|
|
893
|
-
this._debugErr(`[${scriptItemName}/${path}] did not find script!`);
|
|
894
|
-
reject(new LoaderException(`Did not find script '${path}' relative to item ${scriptItemId}`));
|
|
895
|
-
}
|
|
896
|
-
this._debugLog(`[${scriptItemName}/${path}] loading script from cloud`);
|
|
897
|
-
const script = await this.engine.loadingManager.loadScript(scriptItemId, item, {
|
|
898
|
-
waitUntilFinished: true
|
|
899
|
-
});
|
|
900
|
-
const code = script.getCode() || "";
|
|
901
|
-
this._debugLog(`[${scriptItemName}/${path}] ${code.length} characters loaded. adding script to engine`);
|
|
902
|
-
if (code.length === 0) {
|
|
903
|
-
debugger;
|
|
904
|
-
}
|
|
905
|
-
this.engine.addScript(scriptItemId, script);
|
|
906
|
-
this._debugLog(`[${scriptItemName}/${path}] done.`);
|
|
907
|
-
resolve({ item, script });
|
|
908
|
-
});
|
|
909
|
-
this.importedLibsPromises[key] = promise;
|
|
910
|
-
this._debugLog(`[${scriptItemId}] Imported libs promises: `, this.importedLibsPromises);
|
|
911
|
-
return promise;
|
|
912
|
-
}
|
|
913
|
-
async _injectValues(scriptId, scriptItemName, scriptRunner) {
|
|
914
|
-
const injectedFieldsMap = scriptRunner.getInjectedFields();
|
|
915
|
-
for (const key in injectedFieldsMap) {
|
|
916
|
-
try {
|
|
917
|
-
if (injectedFieldsMap.hasOwnProperty(key)) {
|
|
918
|
-
const entry = injectedFieldsMap[key];
|
|
919
|
-
const value = entry.value;
|
|
920
|
-
if (value !== null && value !== undefined) {
|
|
921
|
-
let payload;
|
|
922
|
-
if (entry.type === "String" && key === "node")
|
|
923
|
-
payload = this.packMessage({ scriptName: scriptItemName, value: value, scriptId: scriptId });
|
|
924
|
-
else
|
|
925
|
-
payload = this.packMessage(value);
|
|
926
|
-
const funcName = `__set_object_${key}`;
|
|
927
|
-
if (this.functionExists(scriptId, funcName))
|
|
928
|
-
await this.callFunctionWithObject(scriptId, funcName, payload);
|
|
929
|
-
}
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
catch (err) {
|
|
933
|
-
console.error(err);
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
_prepareCode(code, scriptItemId, injectedFields = undefined) {
|
|
938
|
-
let varCode = "";
|
|
939
|
-
let injectedVarsNumLines = 0;
|
|
940
|
-
if (injectedFields) {
|
|
941
|
-
for (const field of injectedFields) {
|
|
942
|
-
switch (field.type) {
|
|
943
|
-
case 'node':
|
|
944
|
-
if (field.name === 'node')
|
|
945
|
-
varCode += `function __set_object_${field.name}(object, data, len) object:_setNode(__api_internal.fetchAndUnpack(data, len)) end\n`;
|
|
946
|
-
else
|
|
947
|
-
varCode += `function __set_object_${field.name}(object, data, len) if type(object.${field.name}) == 'table' then object.${field.name}:set(__api_sceneobject:findById(__api_internal.fetchAndUnpack(data, len))) else object.${field.name} = __api_sceneobject:findById(__api_internal.fetchAndUnpack(data, len)) end end\n`;
|
|
948
|
-
injectedVarsNumLines++;
|
|
949
|
-
break;
|
|
950
|
-
default:
|
|
951
|
-
varCode += `function __set_object_${field.name}(object, data, len) if type(object.${field.name}) == 'table' then object.${field.name}:set(__api_internal.fetchAndUnpack(data, len)) else object.${field.name} = __api_internal.fetchAndUnpack(data, len) end end\n`;
|
|
952
|
-
injectedVarsNumLines++;
|
|
953
|
-
break;
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
const preparedCode = moduleTemplate.replace('--##CODE##', code).replaceAll('##SCRIPTITEMID##', scriptItemId).replace('--##INJECTEDVARS##', varCode);
|
|
958
|
-
const breakpointsOffset = this.moduleTemplateCodeLineOffset + injectedVarsNumLines + 1;
|
|
959
|
-
return {
|
|
960
|
-
preparedCode,
|
|
961
|
-
breakpointsOffset
|
|
962
|
-
};
|
|
963
|
-
}
|
|
964
|
-
_calculateModuleTemplateCodeLineOffset() {
|
|
965
|
-
const codeOffset = moduleTemplate.indexOf('--##CODE##');
|
|
966
|
-
let count = 0;
|
|
967
|
-
for (let i = 0; i < codeOffset; i++)
|
|
968
|
-
count += +(moduleTemplate[i] === '\n');
|
|
969
|
-
return count;
|
|
970
|
-
}
|
|
971
|
-
addEventListener(eventType, listenerId, isOnce, scriptId) {
|
|
972
|
-
// First we find the event within the event listeners
|
|
973
|
-
// ----------------------------------------------------------
|
|
974
|
-
let listenersMap = this.eventListeners.get(eventType);
|
|
975
|
-
if (!listenersMap) {
|
|
976
|
-
listenersMap = new Map();
|
|
977
|
-
this.eventListeners.set(eventType, listenersMap);
|
|
978
|
-
}
|
|
979
|
-
// Now we can add the listener to it
|
|
980
|
-
// ----------------------------------------------------------
|
|
981
|
-
listenersMap.set(listenerId, {
|
|
982
|
-
isOnce: !!isOnce,
|
|
983
|
-
scriptId: scriptId
|
|
984
|
-
});
|
|
985
|
-
}
|
|
986
|
-
removeEventListener(eventType, scriptId) {
|
|
987
|
-
const listenersMap = this.eventListeners.get(eventType);
|
|
988
|
-
if (!listenersMap) {
|
|
989
|
-
return;
|
|
990
|
-
}
|
|
991
|
-
const listenerIdsToDelete = [];
|
|
992
|
-
for (const [listenerId, listenerData] of listenersMap.entries()) {
|
|
993
|
-
if (listenerData.scriptId === scriptId) {
|
|
994
|
-
listenerIdsToDelete.push(listenerId);
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
for (const listenerId of listenerIdsToDelete) {
|
|
998
|
-
listenersMap.delete(listenerId);
|
|
999
|
-
}
|
|
1000
|
-
if (listenersMap.size === 0) {
|
|
1001
|
-
this.eventListeners.delete(eventType);
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
pushEvent(event) {
|
|
1005
|
-
const scriptMap = this.eventListeners.get(event.type);
|
|
1006
|
-
if (!scriptMap || !scriptMap.size)
|
|
1007
|
-
return;
|
|
1008
|
-
const keysToDelete = [];
|
|
1009
|
-
for (const [listenerId, value] of scriptMap.entries()) {
|
|
1010
|
-
try {
|
|
1011
|
-
const eventMsg = this.packMessage({ event, listenerId });
|
|
1012
|
-
this.callFunc("__event", eventMsg);
|
|
1013
|
-
if (value.isOnce) {
|
|
1014
|
-
keysToDelete.push(listenerId);
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
catch (err) {
|
|
1018
|
-
console.error(err);
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
for (const key of keysToDelete) {
|
|
1022
|
-
scriptMap.delete(key);
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
correctScriptLocs(message) {
|
|
1026
|
-
let correctedMessage = message;
|
|
1027
|
-
for (const [scriptName, offset] of Object.entries(this.scriptLocOffsets)) {
|
|
1028
|
-
correctedMessage = this.offsetScriptLocs(correctedMessage, scriptName, offset);
|
|
1029
|
-
}
|
|
1030
|
-
return correctedMessage;
|
|
1031
|
-
}
|
|
1032
|
-
// Offsets the lines of code (LOC) for logs in the format "<scriptName>::<scriptId>:<loc>:"
|
|
1033
|
-
// to reflect the actual LOC as seen in the editor (counteracts injected code).
|
|
1034
|
-
offsetScriptLocs(message, scriptName, offset) {
|
|
1035
|
-
const regexp = new RegExp(`(${scriptName}::[a-f0-9]+):(\\d+)`, "g");
|
|
1036
|
-
return message.replace(regexp, (match, scriptIdentifier, loc) => {
|
|
1037
|
-
const newLoc = Number(loc) - offset;
|
|
1038
|
-
const newLocWithInjection = `${newLoc}${newLoc <= 0 ? "(injected code)" : ""}`;
|
|
1039
|
-
return `${scriptName}:${newLocWithInjection}`;
|
|
1040
|
-
});
|
|
1041
|
-
}
|
|
1042
|
-
async getPublicProperties(code, scriptItemName, scriptItemId) {
|
|
1043
|
-
this._debugLog(`[${scriptItemName}] Fetching properties for script ---------------------------------`);
|
|
1044
|
-
await this._parseAndLoadImportedLibs(code, scriptItemId, scriptItemName);
|
|
1045
|
-
const { preparedCode, breakpointsOffset } = this._prepareCode(code, scriptItemId, []);
|
|
1046
|
-
this.scriptLocOffsets[scriptItemName] = breakpointsOffset;
|
|
1047
|
-
this._debugLog(`[${scriptItemName}] Everything imported. Running code now for scanning...`);
|
|
1048
|
-
const resultJson = this.lua.script_get_props(preparedCode, scriptItemName, scriptItemId);
|
|
1049
|
-
if (!resultJson) {
|
|
1050
|
-
this._debugLog(`[${scriptItemName}] Script has no result.`);
|
|
1051
|
-
this._debugLog(`[${scriptItemName}] ---------------------------------------------------------------`);
|
|
1052
|
-
return [];
|
|
1053
|
-
}
|
|
1054
|
-
const result = JSON.parse(resultJson);
|
|
1055
|
-
if (result.error) {
|
|
1056
|
-
this._debugErr(`[${scriptItemName}] Error in code:`, result.error);
|
|
1057
|
-
this._debugLog(`[${scriptItemName}] ---------------------------------------------------------------`);
|
|
1058
|
-
return [];
|
|
1059
|
-
}
|
|
1060
|
-
if (Array.isArray(result.props)) {
|
|
1061
|
-
if (SE_DEBUG_LOG) {
|
|
1062
|
-
this._debugLog(`[${scriptItemName}] Script has props: [${result.props.map(x => x.name).join(', ')}]`);
|
|
1063
|
-
this._debugLog(`[${scriptItemName}] ---------------------------------------------------------------`);
|
|
1064
|
-
}
|
|
1065
|
-
return result.props;
|
|
1066
|
-
}
|
|
1067
|
-
else {
|
|
1068
|
-
this._debugLog(`[${scriptItemName}] Script has no props.`);
|
|
1069
|
-
this._debugLog(`[${scriptItemName}] ---------------------------------------------------------------`);
|
|
1070
|
-
return [];
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
}
|
|
1074
|
-
//# sourceMappingURL=ScriptEngine.js.map
|