@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
package/dist/Renderer.js
DELETED
|
@@ -1,1867 +0,0 @@
|
|
|
1
|
-
// -----------------------------------------------------------------------------------------------------------
|
|
2
|
-
// __ ______ __ __ ______ __ __ ______ ______ ______
|
|
3
|
-
// /\ \ /\ ___\ /\ "-./ \ /\ __ \ /\ "-.\ \ /\ __ \ /\__ _\ /\ ___\
|
|
4
|
-
// \ \ \____ \ \ __\ \ \ \-./\ \ \ \ \/\ \ \ \ \-. \ \ \ __ \ \/_/\ \/ \ \ __\
|
|
5
|
-
// \ \_____\ \ \_____\ \ \_\ \ \_\ \ \_____\ \ \_\\"\_\ \ \_\ \_\ \ \_\ \ \_____\
|
|
6
|
-
// \/_____/ \/_____/ \/_/ \/_/ \/_____/ \/_/ \/_/ \/_/\/_/ \/_/ \/_____/
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// Copyright 2023- Luminocity AG
|
|
10
|
-
//
|
|
11
|
-
// "I’m walking here!" - Grand Theft Auto IV (2008)
|
|
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
|
-
// External
|
|
29
|
-
// ----------------------------------------------------------------------------------
|
|
30
|
-
import * as lodash from 'lodash';
|
|
31
|
-
import Stats from "stats-gl";
|
|
32
|
-
import { LoadingManager, ReinhardToneMapping, OrthographicCamera, Vector3, Vector4, Vector2, Quaternion, Raycaster, DataTexture, RGBAFormat, LinearSRGBColorSpace, MeshBasicMaterial, SRGBColorSpace, CineonToneMapping, ACESFilmicToneMapping, NoToneMapping, LinearToneMapping, TextureLoader, Material, PMREMGenerator, UnsignedByteType, Color, AdditiveBlending, LessDepth, Texture, VSMShadowMap, PCFShadowMap, PCFSoftShadowMap, BasicShadowMap, PerspectiveCamera, MeshDepthMaterial, Matrix4 } from "three";
|
|
33
|
-
// Three.js extensions
|
|
34
|
-
// ----------------------------------------------------------------------------------
|
|
35
|
-
import { WebGLRenderer } from "./threejs/WebGLRenderer";
|
|
36
|
-
import "./threejs/Object3DExtensions.js";
|
|
37
|
-
import "./threejs/Box3Extensions.js";
|
|
38
|
-
// Fonts
|
|
39
|
-
// ----------------------------------------------------------------------------------
|
|
40
|
-
import openSansRegularUrl from '../fonts/open-sans-v44-latin-regular.woff2';
|
|
41
|
-
// Subsystems
|
|
42
|
-
// ----------------------------------------------------------------------------------
|
|
43
|
-
import { Composer } from "./subsystems/composer/composer";
|
|
44
|
-
import { GBufferMaterial } from "./subsystems/composer/materials/GBufferMaterial";
|
|
45
|
-
// Helpers
|
|
46
|
-
// ----------------------------------------------------------------------------------
|
|
47
|
-
import { ViewHelper } from "./helpers/ViewHelper";
|
|
48
|
-
// Tools
|
|
49
|
-
// ----------------------------------------------------------------------------------
|
|
50
|
-
import textureTools from "./tools/TextureTools";
|
|
51
|
-
import tools from "./Tools";
|
|
52
|
-
// Other
|
|
53
|
-
// ---------------------------------------------------------------------------------
|
|
54
|
-
import { RenderOptions } from "./RenderOptions";
|
|
55
|
-
import { Canvas } from "./Canvas";
|
|
56
|
-
import { ForwardRenderer } from "./renderers/ForwardRenderer";
|
|
57
|
-
import { RenderPassInfo } from "./RenderPassInfo";
|
|
58
|
-
import { RenderView } from "./RenderView";
|
|
59
|
-
import { loadFontFace } from "./tools/FontTools";
|
|
60
|
-
import { PauseType } from "./Player";
|
|
61
|
-
export var ShadowMode;
|
|
62
|
-
(function (ShadowMode) {
|
|
63
|
-
ShadowMode[ShadowMode["Basic"] = 1] = "Basic";
|
|
64
|
-
ShadowMode[ShadowMode["Pcf"] = 2] = "Pcf";
|
|
65
|
-
ShadowMode[ShadowMode["PcfSoft"] = 3] = "PcfSoft";
|
|
66
|
-
ShadowMode[ShadowMode["Vsm"] = 4] = "Vsm";
|
|
67
|
-
})(ShadowMode || (ShadowMode = {}));
|
|
68
|
-
const layerIndexHelper = 31;
|
|
69
|
-
const LayerIndexNormalsHelper = 31;
|
|
70
|
-
const LayerIndexGridHelper = 31;
|
|
71
|
-
const LayerIndexAxesHelper = 31;
|
|
72
|
-
const LayerIndexTransformControls = 31;
|
|
73
|
-
const LayerIndexCameraHelper = 31;
|
|
74
|
-
export { layerIndexHelper, LayerIndexGridHelper, LayerIndexNormalsHelper, LayerIndexAxesHelper, LayerIndexTransformControls, LayerIndexCameraHelper };
|
|
75
|
-
export var RenderMode;
|
|
76
|
-
(function (RenderMode) {
|
|
77
|
-
RenderMode[RenderMode["Forward"] = 0] = "Forward";
|
|
78
|
-
})(RenderMode || (RenderMode = {}));
|
|
79
|
-
export var CameraMode;
|
|
80
|
-
(function (CameraMode) {
|
|
81
|
-
CameraMode[CameraMode["None"] = -1] = "None";
|
|
82
|
-
CameraMode[CameraMode["AutomaticUserControllable"] = 0] = "AutomaticUserControllable";
|
|
83
|
-
CameraMode[CameraMode["MainCamera"] = 1] = "MainCamera";
|
|
84
|
-
CameraMode[CameraMode["Composer"] = 2] = "Composer";
|
|
85
|
-
CameraMode[CameraMode["Manual"] = 3] = "Manual";
|
|
86
|
-
})(CameraMode || (CameraMode = {}));
|
|
87
|
-
export var OutputMode;
|
|
88
|
-
(function (OutputMode) {
|
|
89
|
-
OutputMode[OutputMode["EditorCamera"] = 0] = "EditorCamera";
|
|
90
|
-
OutputMode[OutputMode["SceneCamera"] = 1] = "SceneCamera";
|
|
91
|
-
OutputMode[OutputMode["Composition"] = 2] = "Composition";
|
|
92
|
-
})(OutputMode || (OutputMode = {}));
|
|
93
|
-
export class RenderViewport {
|
|
94
|
-
engine;
|
|
95
|
-
id;
|
|
96
|
-
name;
|
|
97
|
-
rect;
|
|
98
|
-
renderer;
|
|
99
|
-
constructor(engine, id, name, rect, renderer) {
|
|
100
|
-
this.engine = engine;
|
|
101
|
-
this.id = id;
|
|
102
|
-
this.name = name;
|
|
103
|
-
this.rect = rect;
|
|
104
|
-
this.renderer = renderer;
|
|
105
|
-
}
|
|
106
|
-
setViewport(rect) {
|
|
107
|
-
this.rect = rect;
|
|
108
|
-
}
|
|
109
|
-
remove() {
|
|
110
|
-
this.engine.renderer.additionalRenderViewports.delete(this.id);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
export const MaxLayerCount = 30;
|
|
114
|
-
export class Renderer {
|
|
115
|
-
engine;
|
|
116
|
-
cache;
|
|
117
|
-
options;
|
|
118
|
-
renderView = null;
|
|
119
|
-
webGlRenderer;
|
|
120
|
-
raycaster;
|
|
121
|
-
renderers = {};
|
|
122
|
-
requestFrameFuncs = [];
|
|
123
|
-
activeComposition;
|
|
124
|
-
nullCanvas;
|
|
125
|
-
activeCanvas;
|
|
126
|
-
composer;
|
|
127
|
-
particleSystems = [];
|
|
128
|
-
stats;
|
|
129
|
-
onResizeFuncs = [];
|
|
130
|
-
loadingManager;
|
|
131
|
-
loading = false;
|
|
132
|
-
loadingProgress = 0;
|
|
133
|
-
activeCamera;
|
|
134
|
-
editorCamera;
|
|
135
|
-
editorCameraWorldMatrix = new Matrix4();
|
|
136
|
-
renderOptions = new RenderOptions();
|
|
137
|
-
mainRenderView;
|
|
138
|
-
mainRenderViewport;
|
|
139
|
-
additionalRenderViewports = new Map();
|
|
140
|
-
backgroundOverrideColor;
|
|
141
|
-
targetAspectRatio;
|
|
142
|
-
renderMode = RenderMode.Forward;
|
|
143
|
-
updateRender = false;
|
|
144
|
-
alwaysRender = false;
|
|
145
|
-
rendering = false;
|
|
146
|
-
automaticPointerLock = false;
|
|
147
|
-
emitFramebuffer = false;
|
|
148
|
-
info;
|
|
149
|
-
layers = [];
|
|
150
|
-
// The size of the actual rendering
|
|
151
|
-
width = 0;
|
|
152
|
-
height = 0;
|
|
153
|
-
// The size of the container render view. This might be bigger due to target aspect ratio
|
|
154
|
-
viewWidth;
|
|
155
|
-
viewHeight;
|
|
156
|
-
mousePos = new Vector2();
|
|
157
|
-
mousePosDown = new Vector2();
|
|
158
|
-
mousePosNormalized = new Vector2();
|
|
159
|
-
mousePosDownNormalized = new Vector2();
|
|
160
|
-
editorOutputOptions = [];
|
|
161
|
-
editorOutputOption;
|
|
162
|
-
viewHelper;
|
|
163
|
-
rootItem;
|
|
164
|
-
materials = [];
|
|
165
|
-
// Default resources (three.js)
|
|
166
|
-
defaultEnvMap;
|
|
167
|
-
shadowTexture;
|
|
168
|
-
wireframeMaterial;
|
|
169
|
-
wireframeLineMaterial;
|
|
170
|
-
defaultUvTestTexture;
|
|
171
|
-
// XR
|
|
172
|
-
xrControllerModelFactory;
|
|
173
|
-
xrController1;
|
|
174
|
-
xrController2;
|
|
175
|
-
xrSession;
|
|
176
|
-
getCurrentTime = () => performance.now();
|
|
177
|
-
timeProviderSet = false;
|
|
178
|
-
_removeEventListeners;
|
|
179
|
-
_propagateCollabCameraMatrix;
|
|
180
|
-
constructor(renderView, engine, cache, options) {
|
|
181
|
-
if (!cache)
|
|
182
|
-
throw "Renderer(): cache not set!";
|
|
183
|
-
this.options = options;
|
|
184
|
-
this.renderView = renderView;
|
|
185
|
-
this.engine = engine;
|
|
186
|
-
this.cache = cache;
|
|
187
|
-
this.nullCanvas = new Canvas(this, "Null Canvas");
|
|
188
|
-
this.activeCanvas = this.nullCanvas;
|
|
189
|
-
this.renderers = {
|
|
190
|
-
forward: new ForwardRenderer(this.engine)
|
|
191
|
-
};
|
|
192
|
-
for (let i = 0; i < MaxLayerCount; i++) {
|
|
193
|
-
this.layers.push(`Layer ${i + 1}`);
|
|
194
|
-
}
|
|
195
|
-
// Initialization of renderer
|
|
196
|
-
// ---------------------------------------------------------------------
|
|
197
|
-
let webGlRenderer = new WebGLRenderer(options);
|
|
198
|
-
webGlRenderer.xr.enabled = true;
|
|
199
|
-
// This is needed so we can focus the canvas
|
|
200
|
-
webGlRenderer.domElement.setAttribute("tabindex", 1);
|
|
201
|
-
if (this.renderView)
|
|
202
|
-
this.renderView.appendChild(webGlRenderer.domElement);
|
|
203
|
-
try {
|
|
204
|
-
if (options.canvas) {
|
|
205
|
-
this.width = options.canvas.width;
|
|
206
|
-
this.height = options.canvas.height;
|
|
207
|
-
}
|
|
208
|
-
else if (this.renderView) {
|
|
209
|
-
this.width = this.renderView.clientWidth || 320;
|
|
210
|
-
this.height = this.renderView.clientHeight || 200;
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
this.width = webGlRenderer.domElement.clientWidth || 320;
|
|
214
|
-
this.height = webGlRenderer.domElement.clientHeight || 200;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
catch {
|
|
218
|
-
// todo
|
|
219
|
-
}
|
|
220
|
-
webGlRenderer.setSize(this.width, this.height);
|
|
221
|
-
this.webGlRenderer = webGlRenderer;
|
|
222
|
-
this.setDevicePixelRatio();
|
|
223
|
-
this.setShadowType(ShadowMode.Pcf);
|
|
224
|
-
this.setRendererSettings();
|
|
225
|
-
//this.setupXrControllers();
|
|
226
|
-
this.composer = new Composer(this.engine, this);
|
|
227
|
-
this.raycaster = new Raycaster();
|
|
228
|
-
this.wireframeMaterial = new MeshBasicMaterial();
|
|
229
|
-
this.wireframeMaterial.color = new Color(0x808080);
|
|
230
|
-
this.wireframeMaterial.polygonOffset = true;
|
|
231
|
-
this.wireframeMaterial.polygonOffsetFactor = 4;
|
|
232
|
-
this.wireframeMaterial.polygonOffsetUnits = 2;
|
|
233
|
-
this.wireframeLineMaterial = new MeshBasicMaterial();
|
|
234
|
-
this.wireframeLineMaterial.color = new Color(0xffffff);
|
|
235
|
-
this.wireframeLineMaterial.wireframe = true;
|
|
236
|
-
this.wireframeLineMaterial.transparent = true;
|
|
237
|
-
this.wireframeLineMaterial.blending = AdditiveBlending;
|
|
238
|
-
this.wireframeLineMaterial.depthFunc = LessDepth;
|
|
239
|
-
this.engine.eventBus.$on("item:contentUpdated", () => this.update());
|
|
240
|
-
for (const key in this.renderers) {
|
|
241
|
-
this.renderers[key].init(this, this.engine);
|
|
242
|
-
}
|
|
243
|
-
// Main and additional render views
|
|
244
|
-
// ---------------------------------------------------------------------
|
|
245
|
-
this.mainRenderView = new RenderView(this.engine, this, "MainRenderView", true);
|
|
246
|
-
this.initLoadingManager();
|
|
247
|
-
this.initStats();
|
|
248
|
-
this.hookEvents();
|
|
249
|
-
// Throttled function to propagate the editor camera matrix to collab server
|
|
250
|
-
// ---------------------------------------------------------------------
|
|
251
|
-
this._propagateCollabCameraMatrix = lodash.throttle((matrix) => {
|
|
252
|
-
const collab = this.engine.apiClient.getCollab();
|
|
253
|
-
const matrix4Tuple = matrix.toArray();
|
|
254
|
-
collab.setLocalStateField("camera", matrix4Tuple);
|
|
255
|
-
}, 500);
|
|
256
|
-
// When awareness changes, we want to update the avatar cameras in the root scene
|
|
257
|
-
// ---------------------------------------------------------------------
|
|
258
|
-
this.engine.eventBus.$on('collab:awareness:changed', (event) => {
|
|
259
|
-
const rootScene = this.engine.mainSceneGraphCollection.getRootScene();
|
|
260
|
-
rootScene.updateCollabAvatars(event.users, event.states);
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
async init() {
|
|
264
|
-
await loadFontFace("OpenSansRegular", openSansRegularUrl);
|
|
265
|
-
this.defaultUvTestTexture = textureTools.generateUVTestTexture();
|
|
266
|
-
}
|
|
267
|
-
hookEvents() {
|
|
268
|
-
if (this.renderView) {
|
|
269
|
-
// We have to remember the pressed buttons of the pointer controller because we will only ever receive a single
|
|
270
|
-
// pointerdown event when a button is pressed. if that button is held and a second button is pressed, this will
|
|
271
|
-
// not cause a second event but it will trigger a pointermove event instead with no actual movement and only
|
|
272
|
-
// changed buttons. By comparing to our pointerButtonBits, we can produce the correct pointerdown events ourselves.
|
|
273
|
-
let pointerButtonBits = [];
|
|
274
|
-
const BIT_TO_BUTTON = [0, 2, 1];
|
|
275
|
-
const _onPointerDown = (event) => {
|
|
276
|
-
this.mousePosDown = new Vector2(event.offsetX, event.offsetY);
|
|
277
|
-
this.mousePosDownNormalized = this.getNormalizedMouseCoords(event);
|
|
278
|
-
pointerButtonBits = tools.getSetBitPositions(event.buttons);
|
|
279
|
-
const result = this.transformCoordsToRenderView({ x: event.offsetX, y: event.offsetY });
|
|
280
|
-
if (result?.isMainRenderView) {
|
|
281
|
-
this.engine.player.pushEvent({
|
|
282
|
-
type: "pointerdown",
|
|
283
|
-
x: result.x,
|
|
284
|
-
y: result.y,
|
|
285
|
-
button: event.button,
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
};
|
|
289
|
-
const _onPointerUp = (event) => {
|
|
290
|
-
this.mousePos = new Vector2(event.offsetX, event.offsetY);
|
|
291
|
-
this.mousePosNormalized = this.getNormalizedMouseCoords(event);
|
|
292
|
-
if (this.mousePosDown && this.mousePos) {
|
|
293
|
-
const diff = this.mousePosNormalized.distanceTo(this.mousePosDownNormalized);
|
|
294
|
-
const shouldRaycast = diff < 0.01 && this.activeCamera && this.raycaster;
|
|
295
|
-
if (shouldRaycast) {
|
|
296
|
-
const intersections = this.raycast(this.mousePos);
|
|
297
|
-
this.engine.eventBus.$emit("engine:raycastResult", {
|
|
298
|
-
event,
|
|
299
|
-
intersections,
|
|
300
|
-
});
|
|
301
|
-
this.engine.player.pushEvent({
|
|
302
|
-
type: "pick",
|
|
303
|
-
intersections: intersections,
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
pointerButtonBits = tools.getSetBitPositions(event.buttons);
|
|
308
|
-
const result = this.transformCoordsToRenderView({ x: event.offsetX, y: event.offsetY });
|
|
309
|
-
if (result?.isMainRenderView) {
|
|
310
|
-
this.engine.player.pushEvent({
|
|
311
|
-
type: "pointerup",
|
|
312
|
-
x: result.x,
|
|
313
|
-
y: result.y,
|
|
314
|
-
button: event.button,
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
};
|
|
318
|
-
const _onPointerMove = (event) => {
|
|
319
|
-
const newPointerButtonBits = tools.getSetBitPositions(event.buttons);
|
|
320
|
-
const { added, removed } = tools.arrayDiff(pointerButtonBits, newPointerButtonBits);
|
|
321
|
-
pointerButtonBits = newPointerButtonBits;
|
|
322
|
-
const result = this.transformCoordsToRenderView({ x: event.offsetX, y: event.offsetY });
|
|
323
|
-
if (result?.isMainRenderView) {
|
|
324
|
-
for (const bit of added) {
|
|
325
|
-
this.engine.player.pushEvent({
|
|
326
|
-
type: "pointerdown",
|
|
327
|
-
x: result.x,
|
|
328
|
-
y: result.y,
|
|
329
|
-
button: BIT_TO_BUTTON[bit]
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
for (const bit of removed) {
|
|
333
|
-
this.engine.player.pushEvent({
|
|
334
|
-
type: "pointerup",
|
|
335
|
-
x: result.x,
|
|
336
|
-
y: result.y,
|
|
337
|
-
button: BIT_TO_BUTTON[bit]
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
this.engine.player.pushEvent({
|
|
341
|
-
type: "pointermove",
|
|
342
|
-
x: result.x,
|
|
343
|
-
y: result.y,
|
|
344
|
-
movementX: event.movementX,
|
|
345
|
-
movementY: event.movementY
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
const _onClick = (event) => {
|
|
350
|
-
this.lockPointer();
|
|
351
|
-
const result = this.transformCoordsToRenderView({ x: event.offsetX, y: event.offsetY });
|
|
352
|
-
if (result?.isMainRenderView) {
|
|
353
|
-
if (!this.engine.player.pushEvent({
|
|
354
|
-
type: "pointerclick",
|
|
355
|
-
x: result.x,
|
|
356
|
-
y: result.y,
|
|
357
|
-
button: event.button,
|
|
358
|
-
})) {
|
|
359
|
-
if (this.editorOutputOption.outputMode === OutputMode.EditorCamera)
|
|
360
|
-
if (this.viewHelper)
|
|
361
|
-
this.viewHelper.handleClick(event);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
};
|
|
365
|
-
const _onDoubleClick = (event) => {
|
|
366
|
-
const result = this.transformCoordsToRenderView({ x: event.offsetX, y: event.offsetY });
|
|
367
|
-
if (result?.isMainRenderView) {
|
|
368
|
-
this.engine.player.pushEvent({
|
|
369
|
-
type: "pointerdoubleclick",
|
|
370
|
-
x: result.x,
|
|
371
|
-
y: result.y,
|
|
372
|
-
button: event.button,
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
};
|
|
376
|
-
const _onWheel = (event) => {
|
|
377
|
-
// The wheel event is processed by the engine, so we need to prevent its default action.
|
|
378
|
-
if (this.options.preventWheelEventDefault)
|
|
379
|
-
event.preventDefault();
|
|
380
|
-
const result = this.transformCoordsToRenderView({ x: event.offsetX, y: event.offsetY });
|
|
381
|
-
if (result?.isMainRenderView) {
|
|
382
|
-
this.engine.player.pushEvent({
|
|
383
|
-
type: "wheel",
|
|
384
|
-
deltaX: event.deltaX,
|
|
385
|
-
deltaY: event.deltaY,
|
|
386
|
-
deltaZ: event.deltaZ,
|
|
387
|
-
deltaMode: event.deltaMode,
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
};
|
|
391
|
-
const _onPointerOut = (event) => {
|
|
392
|
-
this.engine.player.pushEvent({
|
|
393
|
-
type: "pointerout",
|
|
394
|
-
x: event.offsetX,
|
|
395
|
-
y: event.offsetY,
|
|
396
|
-
});
|
|
397
|
-
};
|
|
398
|
-
const _onPointerLeave = (event) => {
|
|
399
|
-
this.engine.player.pushEvent({
|
|
400
|
-
type: "pointerleave",
|
|
401
|
-
x: event.offsetX,
|
|
402
|
-
y: event.offsetY,
|
|
403
|
-
});
|
|
404
|
-
};
|
|
405
|
-
const mapTouches = (touches, event) => {
|
|
406
|
-
const target = event.currentTarget;
|
|
407
|
-
if (!target)
|
|
408
|
-
return [];
|
|
409
|
-
const rect = target.getBoundingClientRect();
|
|
410
|
-
return Array.from(touches)
|
|
411
|
-
.map(touch => {
|
|
412
|
-
const coords = {
|
|
413
|
-
x: touch.clientX - rect.left,
|
|
414
|
-
y: touch.clientY - rect.top,
|
|
415
|
-
};
|
|
416
|
-
// correct coordinates (same as pointerevents)
|
|
417
|
-
const result = this.transformCoordsToRenderView(coords);
|
|
418
|
-
if (result) {
|
|
419
|
-
return {
|
|
420
|
-
identifier: touch.identifier,
|
|
421
|
-
x: result.x,
|
|
422
|
-
y: result.y,
|
|
423
|
-
radiusX: touch.radiusX,
|
|
424
|
-
radiusY: touch.radiusY,
|
|
425
|
-
rotationAngle: touch.rotationAngle,
|
|
426
|
-
force: touch.force,
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
return null;
|
|
430
|
-
})
|
|
431
|
-
//filter out any touches that were not in a render view.
|
|
432
|
-
.filter(Boolean);
|
|
433
|
-
};
|
|
434
|
-
const _onTouchStart = (event) => {
|
|
435
|
-
this.engine.player.pushEvent({
|
|
436
|
-
type: "touchstart",
|
|
437
|
-
altKey: event.altKey,
|
|
438
|
-
metaKey: event.metaKey,
|
|
439
|
-
shiftKey: event.shiftKey,
|
|
440
|
-
ctrlKey: event.ctrlKey,
|
|
441
|
-
touches: mapTouches(event.touches, event),
|
|
442
|
-
changedTouches: mapTouches(event.changedTouches, event)
|
|
443
|
-
});
|
|
444
|
-
};
|
|
445
|
-
const _onTouchMove = (event) => {
|
|
446
|
-
this.engine.player.pushEvent({
|
|
447
|
-
type: "touchmove",
|
|
448
|
-
altKey: event.altKey,
|
|
449
|
-
metaKey: event.metaKey,
|
|
450
|
-
shiftKey: event.shiftKey,
|
|
451
|
-
ctrlKey: event.ctrlKey,
|
|
452
|
-
touches: mapTouches(event.touches, event),
|
|
453
|
-
changedTouches: mapTouches(event.changedTouches, event)
|
|
454
|
-
});
|
|
455
|
-
};
|
|
456
|
-
const _onTouchEnd = (event) => {
|
|
457
|
-
this.engine.player.pushEvent({
|
|
458
|
-
type: "touchend",
|
|
459
|
-
altKey: event.altKey,
|
|
460
|
-
metaKey: event.metaKey,
|
|
461
|
-
shiftKey: event.shiftKey,
|
|
462
|
-
ctrlKey: event.ctrlKey,
|
|
463
|
-
touches: mapTouches(event.touches, event),
|
|
464
|
-
changedTouches: mapTouches(event.changedTouches, event)
|
|
465
|
-
});
|
|
466
|
-
};
|
|
467
|
-
const _onTouchCancel = (event) => {
|
|
468
|
-
this.engine.player.pushEvent({
|
|
469
|
-
type: "touchcancel",
|
|
470
|
-
altKey: event.altKey,
|
|
471
|
-
metaKey: event.metaKey,
|
|
472
|
-
shiftKey: event.shiftKey,
|
|
473
|
-
ctrlKey: event.ctrlKey,
|
|
474
|
-
touches: mapTouches(event.touches, event),
|
|
475
|
-
changedTouches: mapTouches(event.changedTouches, event)
|
|
476
|
-
});
|
|
477
|
-
};
|
|
478
|
-
const _onKeyDown = (event) => {
|
|
479
|
-
// Prevent the default behaviour, because we are handling the event in the engine.
|
|
480
|
-
if (!this.engine.imgui.wantCaptureKeyboard())
|
|
481
|
-
event.preventDefault();
|
|
482
|
-
// only trigger keydown once
|
|
483
|
-
if (event.repeat) {
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
this.engine.player.pushEvent({
|
|
487
|
-
type: "keydown",
|
|
488
|
-
altKey: event.altKey,
|
|
489
|
-
code: event.code,
|
|
490
|
-
ctrlKey: event.ctrlKey,
|
|
491
|
-
isComposing: event.isComposing,
|
|
492
|
-
key: event.key,
|
|
493
|
-
location: event.location,
|
|
494
|
-
metaKey: event.metaKey,
|
|
495
|
-
repeat: event.repeat,
|
|
496
|
-
shiftKey: event.shiftKey,
|
|
497
|
-
});
|
|
498
|
-
};
|
|
499
|
-
const _onKeyUp = (event) => {
|
|
500
|
-
// Prevent the default behaviour, because we are handling the event in the engine.
|
|
501
|
-
if (!this.engine.imgui.wantCaptureKeyboard())
|
|
502
|
-
event.preventDefault();
|
|
503
|
-
this.engine.player.pushEvent({
|
|
504
|
-
type: "keyup",
|
|
505
|
-
altKey: event.altKey,
|
|
506
|
-
code: event.code,
|
|
507
|
-
ctrlKey: event.ctrlKey,
|
|
508
|
-
isComposing: event.isComposing,
|
|
509
|
-
key: event.key,
|
|
510
|
-
location: event.location,
|
|
511
|
-
metaKey: event.metaKey,
|
|
512
|
-
repeat: event.repeat,
|
|
513
|
-
shiftKey: event.shiftKey,
|
|
514
|
-
});
|
|
515
|
-
};
|
|
516
|
-
const _onDragOver = (event) => {
|
|
517
|
-
event.preventDefault();
|
|
518
|
-
};
|
|
519
|
-
const _onDrop = (event) => {
|
|
520
|
-
if (!this.raycaster)
|
|
521
|
-
return;
|
|
522
|
-
event.preventDefault();
|
|
523
|
-
if (event.dataTransfer) {
|
|
524
|
-
const draggedNodes = JSON.parse(event.dataTransfer.getData("draggedNodes"));
|
|
525
|
-
if (Array.isArray(draggedNodes)) {
|
|
526
|
-
for (const draggedNode of draggedNodes) {
|
|
527
|
-
const { id, type } = draggedNode;
|
|
528
|
-
if (!id || !type)
|
|
529
|
-
continue;
|
|
530
|
-
const mousePos = new Vector2(event.offsetX, event.offsetY);
|
|
531
|
-
const intersections = this.raycast(mousePos);
|
|
532
|
-
this.engine.eventBus.$emit("renderer:itemDrop", draggedNode, intersections);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
};
|
|
537
|
-
const _lockChangeAlert = () => {
|
|
538
|
-
const canvas = this.webGlRenderer.domElement;
|
|
539
|
-
if (document.pointerLockElement === canvas) {
|
|
540
|
-
console.log("The pointer lock status is now locked");
|
|
541
|
-
}
|
|
542
|
-
else {
|
|
543
|
-
console.log("The pointer lock status is now unlocked");
|
|
544
|
-
}
|
|
545
|
-
};
|
|
546
|
-
const _lockError = (err) => {
|
|
547
|
-
console.log("Pointer lock failed: ", err);
|
|
548
|
-
};
|
|
549
|
-
const _handleVisibilityChange = () => {
|
|
550
|
-
const eventToEmit = document.visibilityState === "visible" ? "player:resume" : "player:pause";
|
|
551
|
-
this.engine.eventBus.$emit(eventToEmit, PauseType.TAB);
|
|
552
|
-
};
|
|
553
|
-
const _onDeviceOrientation = (event) => {
|
|
554
|
-
this.engine.player.pushEvent({
|
|
555
|
-
type: "deviceorientation",
|
|
556
|
-
alpha: event.alpha,
|
|
557
|
-
beta: event.beta,
|
|
558
|
-
gamma: event.gamma
|
|
559
|
-
});
|
|
560
|
-
};
|
|
561
|
-
const _onDeviceMotion = (event) => {
|
|
562
|
-
const acc = event.accelerationIncludingGravity;
|
|
563
|
-
if (acc) {
|
|
564
|
-
this.engine.player.pushEvent({
|
|
565
|
-
type: "devicemotion",
|
|
566
|
-
x: acc.x,
|
|
567
|
-
y: acc.y,
|
|
568
|
-
z: acc.z
|
|
569
|
-
});
|
|
570
|
-
}
|
|
571
|
-
};
|
|
572
|
-
document.addEventListener("pointerlockchange", _lockChangeAlert, false);
|
|
573
|
-
document.addEventListener("pointerlockerror", _lockError, false);
|
|
574
|
-
document.addEventListener("visibilitychange", _handleVisibilityChange, false);
|
|
575
|
-
const passiveEventsSupported = tools.arePassiveEventsSupported();
|
|
576
|
-
const eventOpts = passiveEventsSupported ? { passive: false, capture: true } : false;
|
|
577
|
-
this.renderView.addEventListener("pointerdown", _onPointerDown, eventOpts);
|
|
578
|
-
this.renderView.addEventListener("pointermove", _onPointerMove, eventOpts);
|
|
579
|
-
this.renderView.addEventListener("click", _onClick, eventOpts);
|
|
580
|
-
this.renderView.addEventListener("dblclick", _onDoubleClick, eventOpts);
|
|
581
|
-
this.renderView.addEventListener("wheel", _onWheel, eventOpts);
|
|
582
|
-
this.renderView.addEventListener("pointerout", _onPointerOut, eventOpts);
|
|
583
|
-
this.renderView.addEventListener("pointerleave", _onPointerLeave, eventOpts);
|
|
584
|
-
this.renderView.addEventListener("pointerup", _onPointerUp, eventOpts);
|
|
585
|
-
this.renderView.addEventListener("dragover", _onDragOver, eventOpts);
|
|
586
|
-
this.renderView.addEventListener("drop", _onDrop, eventOpts);
|
|
587
|
-
this.renderView.addEventListener("keydown", _onKeyDown, eventOpts);
|
|
588
|
-
this.renderView.addEventListener("keyup", _onKeyUp, eventOpts);
|
|
589
|
-
this.renderView.addEventListener("touchstart", _onTouchStart, eventOpts);
|
|
590
|
-
this.renderView.addEventListener("touchend", _onTouchEnd, eventOpts);
|
|
591
|
-
this.renderView.addEventListener("touchcancel", _onTouchCancel, eventOpts);
|
|
592
|
-
this.renderView.addEventListener("touchmove", _onTouchMove, eventOpts);
|
|
593
|
-
if (self.DeviceOrientationEvent) {
|
|
594
|
-
const requestPermission = DeviceOrientationEvent.requestPermission;
|
|
595
|
-
const iOS = typeof requestPermission === 'function';
|
|
596
|
-
if (iOS) {
|
|
597
|
-
requestPermission().then((response) => {
|
|
598
|
-
if (response === 'granted' && this.renderView) {
|
|
599
|
-
this.renderView.addEventListener("deviceorientation", _onDeviceOrientation, eventOpts);
|
|
600
|
-
this.renderView.addEventListener("devicemotion", _onDeviceMotion, eventOpts);
|
|
601
|
-
}
|
|
602
|
-
}).catch(console.error);
|
|
603
|
-
}
|
|
604
|
-
else {
|
|
605
|
-
this.renderView.addEventListener("deviceorientation", _onDeviceOrientation, eventOpts);
|
|
606
|
-
this.renderView.addEventListener("devicemotion", _onDeviceMotion, eventOpts);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
this._removeEventListeners = () => {
|
|
610
|
-
document.removeEventListener("pointerlockchange", _lockChangeAlert);
|
|
611
|
-
document.removeEventListener("pointerlockerror", _lockError);
|
|
612
|
-
document.removeEventListener("visibilitychange", _handleVisibilityChange);
|
|
613
|
-
if (this.renderView) {
|
|
614
|
-
this.renderView.removeEventListener("pointerdown", _onPointerDown);
|
|
615
|
-
this.renderView.removeEventListener("pointermove", _onPointerMove);
|
|
616
|
-
this.renderView.removeEventListener("click", _onClick);
|
|
617
|
-
this.renderView.removeEventListener("dblclick", _onDoubleClick);
|
|
618
|
-
this.renderView.removeEventListener("wheel", _onWheel);
|
|
619
|
-
this.renderView.removeEventListener("pointerout", _onPointerOut);
|
|
620
|
-
this.renderView.removeEventListener("pointerleave", _onPointerLeave);
|
|
621
|
-
this.renderView.removeEventListener("pointerup", _onPointerUp);
|
|
622
|
-
this.renderView.removeEventListener("dragover", _onDragOver);
|
|
623
|
-
this.renderView.removeEventListener("drop", _onDrop);
|
|
624
|
-
this.renderView.removeEventListener("keydown", _onKeyDown);
|
|
625
|
-
this.renderView.removeEventListener("keyup", _onKeyUp);
|
|
626
|
-
this.renderView.removeEventListener("touchstart", _onTouchStart);
|
|
627
|
-
this.renderView.removeEventListener("touchend", _onTouchEnd);
|
|
628
|
-
this.renderView.removeEventListener("touchcancel", _onTouchCancel);
|
|
629
|
-
this.renderView.removeEventListener("touchmove", _onTouchMove);
|
|
630
|
-
this.renderView.removeEventListener("deviceorientation", _onDeviceOrientation);
|
|
631
|
-
this.renderView.removeEventListener("devicemotion", _onDeviceMotion);
|
|
632
|
-
}
|
|
633
|
-
};
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
getDefaultUvTestTexture() {
|
|
637
|
-
return this.defaultUvTestTexture;
|
|
638
|
-
}
|
|
639
|
-
setTargetAspectRatio(ratio) {
|
|
640
|
-
this.targetAspectRatio = ratio;
|
|
641
|
-
}
|
|
642
|
-
setShadowType(mode) {
|
|
643
|
-
switch (mode) {
|
|
644
|
-
case ShadowMode.Basic:
|
|
645
|
-
this.webGlRenderer.shadowMap.type = BasicShadowMap;
|
|
646
|
-
break;
|
|
647
|
-
case ShadowMode.Pcf:
|
|
648
|
-
this.webGlRenderer.shadowMap.type = PCFShadowMap;
|
|
649
|
-
break;
|
|
650
|
-
case ShadowMode.PcfSoft:
|
|
651
|
-
this.webGlRenderer.shadowMap.type = PCFSoftShadowMap;
|
|
652
|
-
break;
|
|
653
|
-
case ShadowMode.Vsm:
|
|
654
|
-
this.webGlRenderer.shadowMap.type = VSMShadowMap;
|
|
655
|
-
break;
|
|
656
|
-
}
|
|
657
|
-
this.webGlRenderer.shadowMap.enabled = true;
|
|
658
|
-
}
|
|
659
|
-
setAutomaticPointerLock(value) {
|
|
660
|
-
this.automaticPointerLock = value;
|
|
661
|
-
}
|
|
662
|
-
async lockPointer(force = false) {
|
|
663
|
-
// check if we want automatic locking
|
|
664
|
-
const isPlaying = this.engine.player.isPlaying();
|
|
665
|
-
if (!isPlaying || !(this.automaticPointerLock || force))
|
|
666
|
-
return;
|
|
667
|
-
// check if we already have a locked pointer
|
|
668
|
-
const canvas = this.webGlRenderer.domElement;
|
|
669
|
-
if (document.pointerLockElement === canvas)
|
|
670
|
-
return;
|
|
671
|
-
try {
|
|
672
|
-
await canvas.requestPointerLock();
|
|
673
|
-
}
|
|
674
|
-
catch (err) {
|
|
675
|
-
console.error(err);
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
unlockPointer() {
|
|
679
|
-
// check if we have a locked pointer
|
|
680
|
-
const canvas = this.webGlRenderer.domElement;
|
|
681
|
-
if (document.pointerLockElement !== canvas)
|
|
682
|
-
return;
|
|
683
|
-
try {
|
|
684
|
-
document.exitPointerLock();
|
|
685
|
-
}
|
|
686
|
-
catch (err) {
|
|
687
|
-
console.error(err);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
isPointerLocked() {
|
|
691
|
-
const canvas = this.webGlRenderer.domElement;
|
|
692
|
-
return document.pointerLockElement === canvas;
|
|
693
|
-
}
|
|
694
|
-
setRenderMode(mode) {
|
|
695
|
-
this.renderMode = mode;
|
|
696
|
-
const impl = this._getRendererImpl();
|
|
697
|
-
if (impl)
|
|
698
|
-
impl.refresh();
|
|
699
|
-
}
|
|
700
|
-
getExtension(name) {
|
|
701
|
-
if (this.webGlRenderer) {
|
|
702
|
-
return this.webGlRenderer.extensions.get(name);
|
|
703
|
-
}
|
|
704
|
-
return null;
|
|
705
|
-
}
|
|
706
|
-
hasExtension(name) {
|
|
707
|
-
if (this.webGlRenderer) {
|
|
708
|
-
return this.webGlRenderer.extensions.has(name);
|
|
709
|
-
}
|
|
710
|
-
return false;
|
|
711
|
-
}
|
|
712
|
-
isWebGL2() {
|
|
713
|
-
if (this.webGlRenderer) {
|
|
714
|
-
const caps = this.webGlRenderer.capabilities;
|
|
715
|
-
return caps.isWebGL2;
|
|
716
|
-
}
|
|
717
|
-
return false;
|
|
718
|
-
}
|
|
719
|
-
getInfo() {
|
|
720
|
-
if (this.webGlRenderer) {
|
|
721
|
-
return {
|
|
722
|
-
capabilities: this.webGlRenderer.capabilities,
|
|
723
|
-
extensions: this.webGlRenderer.extensions,
|
|
724
|
-
info: this.webGlRenderer.info,
|
|
725
|
-
};
|
|
726
|
-
}
|
|
727
|
-
return null;
|
|
728
|
-
}
|
|
729
|
-
ensureShadowTexture() {
|
|
730
|
-
if (this.shadowTexture)
|
|
731
|
-
return this.shadowTexture;
|
|
732
|
-
const pixelSize = 256;
|
|
733
|
-
const canvas = document.createElement("canvas");
|
|
734
|
-
canvas.width = pixelSize;
|
|
735
|
-
canvas.height = pixelSize;
|
|
736
|
-
const ctx = canvas.getContext("2d");
|
|
737
|
-
const gradient = ctx.createRadialGradient(pixelSize / 2, pixelSize / 2, 0, pixelSize / 2, pixelSize / 2, pixelSize / 2);
|
|
738
|
-
for (let i = 0; i < 128; i++) {
|
|
739
|
-
let grey = (128 - i) / 128;
|
|
740
|
-
grey *= grey;
|
|
741
|
-
grey *= 255;
|
|
742
|
-
gradient.addColorStop(i / 128, `rgb(${grey}, ${grey}, ${grey}`);
|
|
743
|
-
}
|
|
744
|
-
ctx.fillStyle = gradient;
|
|
745
|
-
ctx.fillRect(0, 0, pixelSize, pixelSize);
|
|
746
|
-
this.shadowTexture = new Texture(canvas);
|
|
747
|
-
this.shadowTexture.needsUpdate = true;
|
|
748
|
-
return this.shadowTexture;
|
|
749
|
-
}
|
|
750
|
-
ensureDefaultEnvMap() {
|
|
751
|
-
if (!this.defaultEnvMap) {
|
|
752
|
-
const width = 128;
|
|
753
|
-
const height = 128;
|
|
754
|
-
const size = width * height;
|
|
755
|
-
const data = new Uint8Array(4 * size);
|
|
756
|
-
for (let i = 0; i < size; i++) {
|
|
757
|
-
data[i * 4] = 255;
|
|
758
|
-
data[i * 4 + 1] = 255;
|
|
759
|
-
data[i * 4 + 2] = 255;
|
|
760
|
-
data[i * 4 + 3] = 255;
|
|
761
|
-
}
|
|
762
|
-
const dataTexture = new DataTexture(data, width, height, RGBAFormat, UnsignedByteType);
|
|
763
|
-
dataTexture.needsUpdate = true;
|
|
764
|
-
const pmremGenerator = new PMREMGenerator(this.webGlRenderer);
|
|
765
|
-
pmremGenerator.compileEquirectangularShader();
|
|
766
|
-
const target = pmremGenerator.fromEquirectangular(dataTexture);
|
|
767
|
-
pmremGenerator.dispose();
|
|
768
|
-
this.defaultEnvMap = target.texture;
|
|
769
|
-
}
|
|
770
|
-
return this.defaultEnvMap;
|
|
771
|
-
}
|
|
772
|
-
getEditorOutputOptions() {
|
|
773
|
-
return this.editorOutputOptions;
|
|
774
|
-
}
|
|
775
|
-
getEditorOutputOption() {
|
|
776
|
-
if (this.editorOutputOption)
|
|
777
|
-
return this.editorOutputOption.id;
|
|
778
|
-
else
|
|
779
|
-
return null;
|
|
780
|
-
}
|
|
781
|
-
updateEditorOutputOptions() {
|
|
782
|
-
const options = [{
|
|
783
|
-
outputMode: OutputMode.EditorCamera,
|
|
784
|
-
name: "Free camera",
|
|
785
|
-
id: "freecam",
|
|
786
|
-
}];
|
|
787
|
-
const cameras = this.engine.mainSceneGraphCollection.findItemsByType("Camera");
|
|
788
|
-
for (const camera of cameras) {
|
|
789
|
-
options.push({
|
|
790
|
-
outputMode: OutputMode.SceneCamera,
|
|
791
|
-
camera: camera,
|
|
792
|
-
name: `Camera: ${camera.getName() || "unnamed"}`,
|
|
793
|
-
id: `camera_${camera.getId()}`
|
|
794
|
-
});
|
|
795
|
-
}
|
|
796
|
-
const compositions = this.engine.loadingManager.getItemInstancesOfType("Composition");
|
|
797
|
-
for (const composition of compositions) {
|
|
798
|
-
options.push({
|
|
799
|
-
outputMode: OutputMode.Composition,
|
|
800
|
-
composition: composition,
|
|
801
|
-
name: `Composition: ${composition.getName()}`,
|
|
802
|
-
id: `composition_${composition.getId()}`
|
|
803
|
-
});
|
|
804
|
-
}
|
|
805
|
-
this.editorOutputOptions = options;
|
|
806
|
-
this.engine.eventBus.$emit('renderer:outputOptionsChanged', options);
|
|
807
|
-
}
|
|
808
|
-
updateEditorCameraWorldMatrix() {
|
|
809
|
-
// This function will update the editor camera's world matrix and propagate it to the collab server
|
|
810
|
-
const collab = this.engine.apiClient.getCollab();
|
|
811
|
-
if (this.editorCamera && collab.isActive()) {
|
|
812
|
-
this.editorCamera.updateWorldMatrix(true, false);
|
|
813
|
-
if (!this.editorCamera.matrixWorld.equals(this.editorCameraWorldMatrix)) {
|
|
814
|
-
this.editorCameraWorldMatrix.copy(this.editorCamera.matrixWorld);
|
|
815
|
-
this._propagateCollabCameraMatrix(this.editorCameraWorldMatrix);
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
setEditorOutputOption(id) {
|
|
820
|
-
let found = false;
|
|
821
|
-
const options = this.getEditorOutputOptions();
|
|
822
|
-
for (const option of options) {
|
|
823
|
-
if (option.id === id) {
|
|
824
|
-
this.editorOutputOption = option;
|
|
825
|
-
found = true;
|
|
826
|
-
break;
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
if (!found) {
|
|
830
|
-
console.warn("Editor output option not found: " + id);
|
|
831
|
-
return;
|
|
832
|
-
}
|
|
833
|
-
switch (this.editorOutputOption.outputMode) {
|
|
834
|
-
// The renderer will show one of the 4 editor cameras. Check which one is desired and set it.
|
|
835
|
-
// ---------------------------------------------------------------------------------------------
|
|
836
|
-
case OutputMode.EditorCamera: {
|
|
837
|
-
if (this.activeCamera === this.editorCamera) {
|
|
838
|
-
return;
|
|
839
|
-
}
|
|
840
|
-
this.activeCamera = this.editorCamera;
|
|
841
|
-
this.getEditorScene().recreateControls(false, this.activeCamera);
|
|
842
|
-
break;
|
|
843
|
-
}
|
|
844
|
-
// The renderer will show one of the user defined cameras in the scenegraph
|
|
845
|
-
// ---------------------------------------------------------------------------------------------
|
|
846
|
-
case OutputMode.SceneCamera: {
|
|
847
|
-
this.activeCamera = this.editorOutputOption.camera?.getObject();
|
|
848
|
-
break;
|
|
849
|
-
}
|
|
850
|
-
// The renderer will show one of the compositions, so need to do anything here
|
|
851
|
-
// ---------------------------------------------------------------------------------------------
|
|
852
|
-
case OutputMode.Composition: {
|
|
853
|
-
break;
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
this.updateRender = true;
|
|
857
|
-
this.engine.eventBus.$emit('renderer:outputOptionChanged', this.editorOutputOption.id);
|
|
858
|
-
return this.activeCamera;
|
|
859
|
-
}
|
|
860
|
-
setOrbitControls() {
|
|
861
|
-
this.getEditorScene().setOrbitControls(this.activeCamera);
|
|
862
|
-
}
|
|
863
|
-
setFpsControls() {
|
|
864
|
-
this.getEditorScene().setFpsControls();
|
|
865
|
-
}
|
|
866
|
-
setTransformControlItems(items) {
|
|
867
|
-
this.getEditorScene().setTransformControlItems(items);
|
|
868
|
-
}
|
|
869
|
-
setControlsEnabled(value) {
|
|
870
|
-
this.getEditorScene().setControlsEnabled(value);
|
|
871
|
-
}
|
|
872
|
-
removeComposition() {
|
|
873
|
-
this.setComposition(undefined);
|
|
874
|
-
}
|
|
875
|
-
setComposition(composition) {
|
|
876
|
-
this.activeComposition = composition;
|
|
877
|
-
}
|
|
878
|
-
setRootItemIfEmpty(item) {
|
|
879
|
-
if (!this.rootItem)
|
|
880
|
-
this.rootItem = item;
|
|
881
|
-
}
|
|
882
|
-
listenOnResize(func) {
|
|
883
|
-
this.onResizeFuncs.push(func);
|
|
884
|
-
}
|
|
885
|
-
getNavigatorXr() {
|
|
886
|
-
if ("xr" in navigator) {
|
|
887
|
-
return navigator.xr;
|
|
888
|
-
}
|
|
889
|
-
return null;
|
|
890
|
-
}
|
|
891
|
-
async isVrAvailable() {
|
|
892
|
-
try {
|
|
893
|
-
const xr = this.getNavigatorXr();
|
|
894
|
-
if (xr) {
|
|
895
|
-
return xr.isSessionSupported("immersive-vr");
|
|
896
|
-
}
|
|
897
|
-
}
|
|
898
|
-
catch (err) {
|
|
899
|
-
console.error(err);
|
|
900
|
-
}
|
|
901
|
-
return false;
|
|
902
|
-
}
|
|
903
|
-
isVrActive() {
|
|
904
|
-
return this.xrSession != null;
|
|
905
|
-
}
|
|
906
|
-
toggleVr() {
|
|
907
|
-
const onSessionStarted = (session) => {
|
|
908
|
-
session.addEventListener("end", onSessionEnded);
|
|
909
|
-
this.webGlRenderer.xr.setSession(session);
|
|
910
|
-
this.xrSession = session;
|
|
911
|
-
};
|
|
912
|
-
const onSessionEnded = () => {
|
|
913
|
-
if (this.xrSession) {
|
|
914
|
-
this.xrSession.removeEventListener("end", onSessionEnded);
|
|
915
|
-
this.xrSession = undefined;
|
|
916
|
-
}
|
|
917
|
-
};
|
|
918
|
-
if (!this.xrSession) {
|
|
919
|
-
const xr = this.getNavigatorXr();
|
|
920
|
-
xr.requestSession("immersive-vr", {
|
|
921
|
-
optionalFeatures: ["local-floor", "bounded-floor", "hand-tracking"],
|
|
922
|
-
}).then(onSessionStarted);
|
|
923
|
-
}
|
|
924
|
-
else {
|
|
925
|
-
this.xrSession.end();
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
startVr() {
|
|
929
|
-
if (!this.isVrActive()) {
|
|
930
|
-
this.toggleVr();
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
stopVr() {
|
|
934
|
-
if (this.isVrActive()) {
|
|
935
|
-
this.toggleVr();
|
|
936
|
-
}
|
|
937
|
-
}
|
|
938
|
-
setupXrControllers() {
|
|
939
|
-
const _this = this;
|
|
940
|
-
function onSelectStart() {
|
|
941
|
-
console.log("XR Select start");
|
|
942
|
-
}
|
|
943
|
-
function onSelectEnd() {
|
|
944
|
-
console.log("XR Select end");
|
|
945
|
-
}
|
|
946
|
-
function setupController(index) {
|
|
947
|
-
const xr = _this.webGlRenderer.xr;
|
|
948
|
-
// Create XR Controller
|
|
949
|
-
// -------------------------------------------------------------------------------------------------
|
|
950
|
-
let xrController = xr.getController(index);
|
|
951
|
-
xrController.name = "XRController";
|
|
952
|
-
xrController.addEventListener("selectstart", onSelectStart);
|
|
953
|
-
xrController.addEventListener("selectend", onSelectEnd);
|
|
954
|
-
xrController.addEventListener("connected", function (event) {
|
|
955
|
-
console.log("XR Controller connected", event);
|
|
956
|
-
//this.add( buildController( event.data ) );
|
|
957
|
-
});
|
|
958
|
-
xrController.addEventListener("disconnected", function () {
|
|
959
|
-
console.log("XR Controller disconnected", event);
|
|
960
|
-
//this.remove( this.children[ 0 ] );
|
|
961
|
-
});
|
|
962
|
-
const rootScene = _this.engine.mainSceneGraphCollection.getRootScene();
|
|
963
|
-
rootScene.add(xrController);
|
|
964
|
-
// Create XR Controller Grip
|
|
965
|
-
// -------------------------------------------------------------------------------------------------
|
|
966
|
-
let xrControllerGrip;
|
|
967
|
-
if (_this.xrControllerModelFactory) {
|
|
968
|
-
xrControllerGrip = xr.getControllerGrip(index);
|
|
969
|
-
xrControllerGrip.name = "XRControllerGrip";
|
|
970
|
-
xrControllerGrip.add(_this.xrControllerModelFactory.createControllerModel(xrControllerGrip));
|
|
971
|
-
rootScene.add(xrControllerGrip);
|
|
972
|
-
}
|
|
973
|
-
return { controller: xrController, grip: xrControllerGrip };
|
|
974
|
-
}
|
|
975
|
-
this.xrController1 = setupController(0);
|
|
976
|
-
this.xrController2 = setupController(1);
|
|
977
|
-
}
|
|
978
|
-
setRendererSettings(renderTarget, outputEncoding, toneMapping, toneMappingExposure) {
|
|
979
|
-
// Set defaults
|
|
980
|
-
// -------------------------------------------------
|
|
981
|
-
if (outputEncoding === undefined)
|
|
982
|
-
outputEncoding = "Linear";
|
|
983
|
-
if (toneMappingExposure === undefined)
|
|
984
|
-
toneMappingExposure = 1.0;
|
|
985
|
-
if (toneMapping === undefined)
|
|
986
|
-
toneMapping = "Reinhard";
|
|
987
|
-
// Create objects
|
|
988
|
-
// -------------------------------------------------
|
|
989
|
-
let outputEncodingObj = LinearSRGBColorSpace;
|
|
990
|
-
switch (outputEncoding) {
|
|
991
|
-
case "Linear":
|
|
992
|
-
break;
|
|
993
|
-
case "sRGB":
|
|
994
|
-
outputEncodingObj = SRGBColorSpace;
|
|
995
|
-
break;
|
|
996
|
-
default:
|
|
997
|
-
console.error("Unknown output encoding", outputEncoding);
|
|
998
|
-
break;
|
|
999
|
-
}
|
|
1000
|
-
let toneMappingObj = ReinhardToneMapping;
|
|
1001
|
-
switch (toneMapping) {
|
|
1002
|
-
case "None":
|
|
1003
|
-
toneMappingObj = NoToneMapping;
|
|
1004
|
-
break;
|
|
1005
|
-
case "Linear":
|
|
1006
|
-
toneMappingObj = LinearToneMapping;
|
|
1007
|
-
break;
|
|
1008
|
-
case "Reinhard":
|
|
1009
|
-
break;
|
|
1010
|
-
case "Cineon":
|
|
1011
|
-
toneMappingObj = CineonToneMapping;
|
|
1012
|
-
break;
|
|
1013
|
-
case "ACESFilmic":
|
|
1014
|
-
toneMappingObj = ACESFilmicToneMapping;
|
|
1015
|
-
break;
|
|
1016
|
-
default:
|
|
1017
|
-
console.error("Unknown tone mapping mode", toneMapping);
|
|
1018
|
-
break;
|
|
1019
|
-
}
|
|
1020
|
-
// Set configuration
|
|
1021
|
-
// -------------------------------------------------
|
|
1022
|
-
this.webGlRenderer.toneMapping = toneMappingObj;
|
|
1023
|
-
this.webGlRenderer.toneMappingExposure = toneMappingExposure;
|
|
1024
|
-
if (!renderTarget) {
|
|
1025
|
-
this.webGlRenderer.outputColorSpace = outputEncodingObj;
|
|
1026
|
-
}
|
|
1027
|
-
else {
|
|
1028
|
-
renderTarget.texture.colorSpace = outputEncodingObj;
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
setCameraModeOverride(mode) {
|
|
1032
|
-
this.mainRenderView.setCameraModeOverride(mode);
|
|
1033
|
-
}
|
|
1034
|
-
clearCameraModeOverride() {
|
|
1035
|
-
this.mainRenderView.clearCameraModeOverride();
|
|
1036
|
-
}
|
|
1037
|
-
getCameraMode() {
|
|
1038
|
-
return this.mainRenderView.getCameraMode();
|
|
1039
|
-
}
|
|
1040
|
-
setActiveCamera(camera) {
|
|
1041
|
-
if (camera)
|
|
1042
|
-
this.activeCamera = camera;
|
|
1043
|
-
else
|
|
1044
|
-
this.setEditorOutputOption("freecam");
|
|
1045
|
-
}
|
|
1046
|
-
mapMousePositionToRenderView(pos, normalize = false) {
|
|
1047
|
-
const rect = this.mainRenderViewport || { x: 0, y: 0, width: this.width, height: this.height };
|
|
1048
|
-
pos.x -= rect.x;
|
|
1049
|
-
pos.y -= rect.y;
|
|
1050
|
-
if (normalize) {
|
|
1051
|
-
return {
|
|
1052
|
-
x: pos.x / rect.width * 2 - 1,
|
|
1053
|
-
y: -pos.y / rect.height * 2 + 1,
|
|
1054
|
-
};
|
|
1055
|
-
}
|
|
1056
|
-
else {
|
|
1057
|
-
return pos;
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
normalizeMouseCoords(pos, rect) {
|
|
1061
|
-
const r = rect || { x: 0, y: 0, width: this.width, height: this.height };
|
|
1062
|
-
const x = (pos.x / r.width) * 2 - 1;
|
|
1063
|
-
const y = -(pos.y / r.height) * 2 + 1;
|
|
1064
|
-
return new Vector2(x, y);
|
|
1065
|
-
}
|
|
1066
|
-
getNormalizedMouseCoords(event) {
|
|
1067
|
-
return this.normalizeMouseCoords(new Vector2(event.offsetX, event.offsetY));
|
|
1068
|
-
}
|
|
1069
|
-
async shutdown() {
|
|
1070
|
-
console.log("Shutting down renderer.");
|
|
1071
|
-
if (this._removeEventListeners)
|
|
1072
|
-
this._removeEventListeners();
|
|
1073
|
-
this.stopRendering();
|
|
1074
|
-
if (this.wireframeMaterial) {
|
|
1075
|
-
this.wireframeMaterial.dispose();
|
|
1076
|
-
}
|
|
1077
|
-
if (this.wireframeLineMaterial) {
|
|
1078
|
-
this.wireframeLineMaterial.dispose();
|
|
1079
|
-
}
|
|
1080
|
-
if (this.shadowTexture) {
|
|
1081
|
-
this.shadowTexture.dispose();
|
|
1082
|
-
}
|
|
1083
|
-
console.log("Freeing composition...");
|
|
1084
|
-
this.removeComposition();
|
|
1085
|
-
this.composer.dispose();
|
|
1086
|
-
this.composer = null;
|
|
1087
|
-
console.log("Freeing renderer...");
|
|
1088
|
-
if (this.renderView) {
|
|
1089
|
-
this.renderView.removeChild(this.webGlRenderer.domElement);
|
|
1090
|
-
}
|
|
1091
|
-
if (this.mainRenderView) {
|
|
1092
|
-
this.mainRenderView.dispose();
|
|
1093
|
-
}
|
|
1094
|
-
if (this.nullCanvas) {
|
|
1095
|
-
this.nullCanvas.dispose();
|
|
1096
|
-
}
|
|
1097
|
-
this.webGlRenderer.dispose();
|
|
1098
|
-
console.log("Renderer shut down.");
|
|
1099
|
-
}
|
|
1100
|
-
setActiveCanvas(canvas) {
|
|
1101
|
-
this.activeCanvas = canvas || this.nullCanvas;
|
|
1102
|
-
}
|
|
1103
|
-
getActiveCanvas() {
|
|
1104
|
-
return this.activeCanvas;
|
|
1105
|
-
}
|
|
1106
|
-
getWidth() {
|
|
1107
|
-
return this.width;
|
|
1108
|
-
}
|
|
1109
|
-
getHeight() {
|
|
1110
|
-
return this.height;
|
|
1111
|
-
}
|
|
1112
|
-
getCanvas() {
|
|
1113
|
-
if (this.webGlRenderer)
|
|
1114
|
-
return this.webGlRenderer.domElement;
|
|
1115
|
-
return null;
|
|
1116
|
-
}
|
|
1117
|
-
getContext() {
|
|
1118
|
-
if (this.webGlRenderer) {
|
|
1119
|
-
return this.webGlRenderer.getContext();
|
|
1120
|
-
}
|
|
1121
|
-
return null;
|
|
1122
|
-
}
|
|
1123
|
-
verifyShader(type, code) {
|
|
1124
|
-
const gl = this.getContext();
|
|
1125
|
-
const shader = gl.createShader(type === "Vertex" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER);
|
|
1126
|
-
gl.shaderSource(shader, code);
|
|
1127
|
-
gl.compileShader(shader);
|
|
1128
|
-
const log = gl.getShaderInfoLog(shader);
|
|
1129
|
-
gl.deleteShader(shader);
|
|
1130
|
-
return log;
|
|
1131
|
-
}
|
|
1132
|
-
initLoadingManager() {
|
|
1133
|
-
this.loadingManager = new LoadingManager();
|
|
1134
|
-
this.loadingManager.onStart = (item, loaded, total) => {
|
|
1135
|
-
this.loadingProgress = (100 / total) * loaded;
|
|
1136
|
-
this.loading = true;
|
|
1137
|
-
this.engine.eventBus.$emit("renderer:loadingStart", item, loaded, total);
|
|
1138
|
-
};
|
|
1139
|
-
this.loadingManager.onProgress = (item, loaded, total) => {
|
|
1140
|
-
this.loadingProgress = (100 / total) * loaded;
|
|
1141
|
-
this.engine.eventBus.$emit("renderer:loadingProgress", item, loaded, total);
|
|
1142
|
-
};
|
|
1143
|
-
this.loadingManager.onError = (url) => {
|
|
1144
|
-
this.engine.eventBus.$emit("renderer:loadingError", url);
|
|
1145
|
-
};
|
|
1146
|
-
this.loadingManager.onLoad = () => {
|
|
1147
|
-
this.loading = false;
|
|
1148
|
-
this.engine.eventBus.$emit("renderer:loadingDone");
|
|
1149
|
-
};
|
|
1150
|
-
this.loadingManager.setURLModifier((url) => {
|
|
1151
|
-
if (this.cache &&
|
|
1152
|
-
!url.startsWith("blob:")) {
|
|
1153
|
-
const objectUrl = this.cache.getObjectUrl(url);
|
|
1154
|
-
if (!objectUrl)
|
|
1155
|
-
return url;
|
|
1156
|
-
return objectUrl;
|
|
1157
|
-
}
|
|
1158
|
-
else {
|
|
1159
|
-
return url;
|
|
1160
|
-
}
|
|
1161
|
-
});
|
|
1162
|
-
}
|
|
1163
|
-
initStats() {
|
|
1164
|
-
this.stats = new Stats();
|
|
1165
|
-
// this will patch the threejs render function to capture frame times
|
|
1166
|
-
this.stats.init(this.webGlRenderer);
|
|
1167
|
-
}
|
|
1168
|
-
setRenderOptions(options) {
|
|
1169
|
-
// Make sure all values are set and if not, set the default values
|
|
1170
|
-
// --------------------------------------------------------------------
|
|
1171
|
-
if (options.showWireframe === undefined)
|
|
1172
|
-
options.showWireframe = false;
|
|
1173
|
-
if (options.showGrid === undefined)
|
|
1174
|
-
options.showGrid = true;
|
|
1175
|
-
if (options.showAxes === undefined)
|
|
1176
|
-
options.showAxes = true;
|
|
1177
|
-
if (options.showBackground === undefined)
|
|
1178
|
-
options.showBackground = false;
|
|
1179
|
-
if (options.showNormals === undefined)
|
|
1180
|
-
options.showNormals = false;
|
|
1181
|
-
if (options.showHelpers === undefined)
|
|
1182
|
-
options.showHelpers = true;
|
|
1183
|
-
this.updateRender = true;
|
|
1184
|
-
this.renderOptions.set(options);
|
|
1185
|
-
}
|
|
1186
|
-
getEditorScene() {
|
|
1187
|
-
return this.engine.mainSceneGraphCollection.getRootScene();
|
|
1188
|
-
}
|
|
1189
|
-
getRenderOptions() {
|
|
1190
|
-
return this.renderOptions.get();
|
|
1191
|
-
}
|
|
1192
|
-
update() {
|
|
1193
|
-
this.updateRender = true;
|
|
1194
|
-
const impl = this._getRendererImpl();
|
|
1195
|
-
if (impl)
|
|
1196
|
-
impl.refresh();
|
|
1197
|
-
}
|
|
1198
|
-
getEditorCameraTransform() {
|
|
1199
|
-
const cam = this.editorCamera;
|
|
1200
|
-
if (cam)
|
|
1201
|
-
return {
|
|
1202
|
-
position: JSON.parse(JSON.stringify(cam.position)),
|
|
1203
|
-
rotation: { x: cam.quaternion.x, y: cam.quaternion.y, z: cam.quaternion.z, w: cam.quaternion.w }
|
|
1204
|
-
};
|
|
1205
|
-
else
|
|
1206
|
-
return null;
|
|
1207
|
-
}
|
|
1208
|
-
setViewHelperPosition(x, y) {
|
|
1209
|
-
if (this.viewHelper) {
|
|
1210
|
-
this.viewHelper.renderOffset.x = x;
|
|
1211
|
-
this.viewHelper.renderOffset.y = this.height - y;
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
initEditorCamera(camTransform, nearPlane, farPlane) {
|
|
1215
|
-
nearPlane = nearPlane || 0.01;
|
|
1216
|
-
farPlane = farPlane || 1000;
|
|
1217
|
-
let camPos = camTransform.position || new Vector3(1, 1, 1);
|
|
1218
|
-
let camQuaternion = camTransform.rotation || new Quaternion();
|
|
1219
|
-
if (!(camPos instanceof Vector3)) {
|
|
1220
|
-
camPos = new Vector3(camPos.x || 0, camPos.y || 0, camPos.z || 0);
|
|
1221
|
-
}
|
|
1222
|
-
if (!(camQuaternion instanceof Quaternion)) {
|
|
1223
|
-
camQuaternion = new Quaternion(camQuaternion.x || 0, camQuaternion.y || 0, camQuaternion.z || 0, camQuaternion.w || 1);
|
|
1224
|
-
}
|
|
1225
|
-
const rootScene = this.engine.mainSceneGraphCollection.getRootScene();
|
|
1226
|
-
this.editorCamera = new PerspectiveCamera(60, 4 / 3, nearPlane, farPlane);
|
|
1227
|
-
this.editorCamera.name = "Free camera";
|
|
1228
|
-
this.editorCamera.position.set(camPos.x, camPos.y, camPos.z);
|
|
1229
|
-
if (camQuaternion)
|
|
1230
|
-
this.editorCamera.quaternion.set(camQuaternion.x, camQuaternion.y, camQuaternion.z, camQuaternion.w);
|
|
1231
|
-
this.editorCamera.layers.enableAll();
|
|
1232
|
-
rootScene.add(this.editorCamera);
|
|
1233
|
-
this.viewHelper = new ViewHelper(this.editorCamera, this.webGlRenderer.domElement, 128);
|
|
1234
|
-
this.updateEditorOutputOptions();
|
|
1235
|
-
return this.setEditorOutputOption("freecam");
|
|
1236
|
-
}
|
|
1237
|
-
/**
|
|
1238
|
-
* Set the cullmode of the editor cameras. cullmode should be an array of all the layers to cull, so for example [0, 4, 31]
|
|
1239
|
-
* @param cullmode
|
|
1240
|
-
*/
|
|
1241
|
-
setEditorCameraCullmode(cullmode) {
|
|
1242
|
-
this.editorCamera.layers.enableAll();
|
|
1243
|
-
for (const mode of cullmode) {
|
|
1244
|
-
this.editorCamera.layers.disable(mode);
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
getLayers() {
|
|
1248
|
-
return this.layers;
|
|
1249
|
-
}
|
|
1250
|
-
setLayers(layers) {
|
|
1251
|
-
if (!Array.isArray(layers))
|
|
1252
|
-
throw `Layers has to be an array of string entries!`;
|
|
1253
|
-
for (let i = 0; i < MaxLayerCount; i++) {
|
|
1254
|
-
if (layers.length <= i)
|
|
1255
|
-
this.layers[i] = "";
|
|
1256
|
-
else
|
|
1257
|
-
this.layers[i] = layers[i].toString();
|
|
1258
|
-
}
|
|
1259
|
-
this.engine.eventBus.$emit('renderer:layersChanged');
|
|
1260
|
-
}
|
|
1261
|
-
updateEditorCameraPosition(camPos) {
|
|
1262
|
-
if (this.editorCamera) {
|
|
1263
|
-
this.editorCamera.position.set(camPos.x, camPos.y, camPos.z);
|
|
1264
|
-
}
|
|
1265
|
-
}
|
|
1266
|
-
initEditorFeatures(camera) {
|
|
1267
|
-
const editorScene = this.getEditorScene();
|
|
1268
|
-
editorScene.addDefaultGrid();
|
|
1269
|
-
editorScene.addDefaultAxes();
|
|
1270
|
-
editorScene.createFpsControls(camera);
|
|
1271
|
-
editorScene.createTransformControls();
|
|
1272
|
-
}
|
|
1273
|
-
raycast(position, camera, isNormalized = false) {
|
|
1274
|
-
if (!this.raycaster)
|
|
1275
|
-
return [];
|
|
1276
|
-
camera = camera || this.activeCamera;
|
|
1277
|
-
position = position || this.mousePos;
|
|
1278
|
-
if (!camera)
|
|
1279
|
-
return [];
|
|
1280
|
-
let positionNormalized;
|
|
1281
|
-
if (!isNormalized) {
|
|
1282
|
-
// We need to adjust mouse position to the actual render view that it belongs to
|
|
1283
|
-
// -------------------------------------------------------------------------------
|
|
1284
|
-
let rect;
|
|
1285
|
-
if (this.mainRenderViewport) {
|
|
1286
|
-
if (position.x >= this.mainRenderViewport.x &&
|
|
1287
|
-
position.y >= this.mainRenderViewport.y &&
|
|
1288
|
-
position.x < this.mainRenderViewport.x + this.mainRenderViewport.width &&
|
|
1289
|
-
position.y < this.mainRenderViewport.y + this.mainRenderViewport.height) {
|
|
1290
|
-
position.x -= this.mainRenderViewport.x;
|
|
1291
|
-
position.y -= this.mainRenderViewport.y;
|
|
1292
|
-
rect = this.mainRenderViewport;
|
|
1293
|
-
}
|
|
1294
|
-
else {
|
|
1295
|
-
return [];
|
|
1296
|
-
}
|
|
1297
|
-
}
|
|
1298
|
-
else {
|
|
1299
|
-
rect = { x: 0, y: 0, width: this.width, height: this.height };
|
|
1300
|
-
}
|
|
1301
|
-
positionNormalized = this.normalizeMouseCoords(position, rect);
|
|
1302
|
-
}
|
|
1303
|
-
else {
|
|
1304
|
-
positionNormalized = position;
|
|
1305
|
-
}
|
|
1306
|
-
this.raycaster.setFromCamera(positionNormalized, camera);
|
|
1307
|
-
this.raycaster.layers.mask = camera.layers.mask;
|
|
1308
|
-
this.raycaster.layers.disable(LayerIndexAxesHelper);
|
|
1309
|
-
const scene = this.engine.activeSceneGraphCollection.getRootScene();
|
|
1310
|
-
const intersections = this.raycaster.intersectObjects(scene.children);
|
|
1311
|
-
return intersections;
|
|
1312
|
-
}
|
|
1313
|
-
setMainRenderView(x, y, width, height) {
|
|
1314
|
-
this.mainRenderViewport = { x, y, width, height };
|
|
1315
|
-
}
|
|
1316
|
-
setMainRenderViewFullscreen() {
|
|
1317
|
-
this.mainRenderViewport = undefined;
|
|
1318
|
-
}
|
|
1319
|
-
_transformCoordsToRenderView(coords, rect, targetAspect) {
|
|
1320
|
-
if (targetAspect) {
|
|
1321
|
-
rect = this._rectWithAspect(rect, targetAspect);
|
|
1322
|
-
}
|
|
1323
|
-
if (coords.x >= rect.x &&
|
|
1324
|
-
coords.y >= rect.y &&
|
|
1325
|
-
coords.x < rect.x + rect.width &&
|
|
1326
|
-
coords.y < rect.y + rect.height) {
|
|
1327
|
-
return {
|
|
1328
|
-
x: coords.x - rect.x,
|
|
1329
|
-
y: coords.y - rect.y,
|
|
1330
|
-
renderView: rect,
|
|
1331
|
-
isMainRenderView: false
|
|
1332
|
-
};
|
|
1333
|
-
}
|
|
1334
|
-
return null;
|
|
1335
|
-
}
|
|
1336
|
-
transformCoordsToRenderView(coords) {
|
|
1337
|
-
const mainViewport = this.mainRenderViewport || { x: 0, y: 0, width: this.width, height: this.height };
|
|
1338
|
-
let result = this._transformCoordsToRenderView(coords, mainViewport, this.targetAspectRatio);
|
|
1339
|
-
if (result) {
|
|
1340
|
-
result.isMainRenderView = true;
|
|
1341
|
-
return result;
|
|
1342
|
-
}
|
|
1343
|
-
for (const renderViewport of this.additionalRenderViewports.values()) {
|
|
1344
|
-
result = this._transformCoordsToRenderView(coords, renderViewport.rect);
|
|
1345
|
-
if (result) {
|
|
1346
|
-
result.isMainRenderView = false;
|
|
1347
|
-
return result;
|
|
1348
|
-
}
|
|
1349
|
-
}
|
|
1350
|
-
return null;
|
|
1351
|
-
}
|
|
1352
|
-
addRenderView(name, rect, renderer) {
|
|
1353
|
-
if (typeof (renderer) !== "function" && typeof (renderer?.render) !== 'function') {
|
|
1354
|
-
throw new Error("A renderer has to be submitted that is either a function or an object with a method render()");
|
|
1355
|
-
}
|
|
1356
|
-
const id = tools.createGUID();
|
|
1357
|
-
const renderViewport = new RenderViewport(this.engine, id, name, rect, renderer);
|
|
1358
|
-
this.additionalRenderViewports.set(id, renderViewport);
|
|
1359
|
-
return renderViewport;
|
|
1360
|
-
}
|
|
1361
|
-
renderScreenshot(resizeWidth, resizeHeight, asBase64, quality) {
|
|
1362
|
-
this.emitFramebuffer = true;
|
|
1363
|
-
const listenForScreenshotResult = (resolve, reject) => {
|
|
1364
|
-
this.engine.eventBus.$once("engine:frameBufferResult", frameBufferResult => {
|
|
1365
|
-
const { width, height, pixels } = frameBufferResult;
|
|
1366
|
-
const screenshot = textureTools.encodeToJpeg(pixels, width, height, asBase64, quality ?? 100, resizeWidth, resizeHeight);
|
|
1367
|
-
resolve(screenshot);
|
|
1368
|
-
});
|
|
1369
|
-
const timeout = 3000;
|
|
1370
|
-
setTimeout(() => {
|
|
1371
|
-
reject(`No screenshot event received within ${timeout / 1000} seconds!`);
|
|
1372
|
-
}, timeout);
|
|
1373
|
-
};
|
|
1374
|
-
return new Promise(listenForScreenshotResult);
|
|
1375
|
-
}
|
|
1376
|
-
setTimeProvider(func) {
|
|
1377
|
-
this.getCurrentTime = func;
|
|
1378
|
-
this.timeProviderSet = true;
|
|
1379
|
-
}
|
|
1380
|
-
getDistanceToOrigin() {
|
|
1381
|
-
if (!this.activeCamera) {
|
|
1382
|
-
return "N/A";
|
|
1383
|
-
}
|
|
1384
|
-
return this.activeCamera.position.length();
|
|
1385
|
-
}
|
|
1386
|
-
requestFrame(func) {
|
|
1387
|
-
if (this.rendering)
|
|
1388
|
-
this.requestFrameFuncs.push(func);
|
|
1389
|
-
else
|
|
1390
|
-
func();
|
|
1391
|
-
}
|
|
1392
|
-
_executeRequestFrameFuncs() {
|
|
1393
|
-
if (!this.requestFrameFuncs.length)
|
|
1394
|
-
return false;
|
|
1395
|
-
const funcs = this.requestFrameFuncs;
|
|
1396
|
-
this.requestFrameFuncs = [];
|
|
1397
|
-
for (const func of funcs) {
|
|
1398
|
-
try {
|
|
1399
|
-
func();
|
|
1400
|
-
}
|
|
1401
|
-
catch (err) {
|
|
1402
|
-
console.error(err);
|
|
1403
|
-
}
|
|
1404
|
-
}
|
|
1405
|
-
return true;
|
|
1406
|
-
}
|
|
1407
|
-
_getRendererImpl() {
|
|
1408
|
-
if (this.renderOptions &&
|
|
1409
|
-
(this.renderOptions.showHelpers ||
|
|
1410
|
-
this.renderOptions.showGrid ||
|
|
1411
|
-
this.renderOptions.showNormals ||
|
|
1412
|
-
this.renderOptions.showWireframe)) {
|
|
1413
|
-
// If we show any of the above elements, use the forward renderer, otherwise choose
|
|
1414
|
-
// the one depending on renderMode
|
|
1415
|
-
return this.renderers.forward;
|
|
1416
|
-
}
|
|
1417
|
-
switch (this.renderMode) {
|
|
1418
|
-
case RenderMode.Forward:
|
|
1419
|
-
return this.renderers.forward;
|
|
1420
|
-
default:
|
|
1421
|
-
console.error("No renderer implementation found for render mode: " +
|
|
1422
|
-
this.renderMode);
|
|
1423
|
-
return null;
|
|
1424
|
-
}
|
|
1425
|
-
}
|
|
1426
|
-
renderScene(renderPassInfo) {
|
|
1427
|
-
return this.engine.profiler.measure("Renderer", "renderScene", () => {
|
|
1428
|
-
const camera = renderPassInfo.camera;
|
|
1429
|
-
if (!camera) {
|
|
1430
|
-
console.error("Cannot render without a camera!");
|
|
1431
|
-
return;
|
|
1432
|
-
}
|
|
1433
|
-
// Grab the root scene from the scenegraph collection and also get width/height/aspect properties
|
|
1434
|
-
// -------------------------------------------------------------------------------------------------
|
|
1435
|
-
const scene = renderPassInfo.sceneGraphCollection.getRootScene();
|
|
1436
|
-
const w = renderPassInfo.resolution.x;
|
|
1437
|
-
const h = renderPassInfo.resolution.y;
|
|
1438
|
-
const aspect = w / h;
|
|
1439
|
-
// Update the camera
|
|
1440
|
-
// -------------------------------------------------------------------------------------------------
|
|
1441
|
-
if (camera instanceof PerspectiveCamera) {
|
|
1442
|
-
if (camera.aspect !== aspect) {
|
|
1443
|
-
camera.aspect = aspect;
|
|
1444
|
-
camera.updateProjectionMatrix();
|
|
1445
|
-
}
|
|
1446
|
-
}
|
|
1447
|
-
else if (camera instanceof OrthographicCamera) {
|
|
1448
|
-
const width = camera.right - camera.left;
|
|
1449
|
-
const height = camera.top - camera.bottom;
|
|
1450
|
-
const center = camera.bottom + height / 2;
|
|
1451
|
-
const newHeight = width / aspect;
|
|
1452
|
-
if (height !== newHeight) {
|
|
1453
|
-
camera.top = center + newHeight / 2;
|
|
1454
|
-
camera.bottom = center - newHeight / 2;
|
|
1455
|
-
camera.updateProjectionMatrix();
|
|
1456
|
-
}
|
|
1457
|
-
}
|
|
1458
|
-
// Update the particle system FOV
|
|
1459
|
-
// -------------------------------------------------------------------------------------------------
|
|
1460
|
-
if (this.particleSystems && camera instanceof PerspectiveCamera) {
|
|
1461
|
-
this.particleSystems.forEach(system => system.setCamera(camera));
|
|
1462
|
-
}
|
|
1463
|
-
// Get the renderer implementation to use
|
|
1464
|
-
// -------------------------------------------------------------------------------------------------
|
|
1465
|
-
const rendererImpl = this._getRendererImpl();
|
|
1466
|
-
rendererImpl.update(scene);
|
|
1467
|
-
const overrideMaterial = renderPassInfo.overrideMaterial;
|
|
1468
|
-
this.webGlRenderer.info.autoReset = false;
|
|
1469
|
-
// Save original background & overrideMaterial
|
|
1470
|
-
// -------------------------------------------------------------------------------------------------
|
|
1471
|
-
const originalBackground = scene.background;
|
|
1472
|
-
const originalOverride = scene.overrideMaterial;
|
|
1473
|
-
if (renderPassInfo.disableBackground)
|
|
1474
|
-
scene.background = null;
|
|
1475
|
-
if (overrideMaterial)
|
|
1476
|
-
scene.overrideMaterial = overrideMaterial;
|
|
1477
|
-
const originalVisible = new Map();
|
|
1478
|
-
scene.traverse(object => {
|
|
1479
|
-
const mesh = object;
|
|
1480
|
-
if (mesh.material) {
|
|
1481
|
-
originalVisible.set(mesh, mesh.visible);
|
|
1482
|
-
const original = mesh.material;
|
|
1483
|
-
const needsDepthSkip = overrideMaterial instanceof GBufferMaterial && original.depthWrite === false;
|
|
1484
|
-
const needsVisibilityChange = overrideMaterial instanceof MeshDepthMaterial && original.depthWrite === false;
|
|
1485
|
-
const skipTransparent = renderPassInfo.skipTransparent && original.transparent;
|
|
1486
|
-
if (needsDepthSkip || needsVisibilityChange || skipTransparent) {
|
|
1487
|
-
object.visible = false;
|
|
1488
|
-
}
|
|
1489
|
-
}
|
|
1490
|
-
});
|
|
1491
|
-
// Render the scene using the renderer implementation
|
|
1492
|
-
// -------------------------------------------------------------------------------------------------
|
|
1493
|
-
rendererImpl.render(scene, camera, renderPassInfo.cameraDidMove, renderPassInfo.currentPlayerTimeMs, renderPassInfo.resolution, function (newPassIndex) {
|
|
1494
|
-
renderPassInfo.index = newPassIndex;
|
|
1495
|
-
});
|
|
1496
|
-
// Restore original state
|
|
1497
|
-
// -------------------------------------------------------------------------------------------------
|
|
1498
|
-
if (renderPassInfo.disableBackground) {
|
|
1499
|
-
scene.background = originalBackground;
|
|
1500
|
-
}
|
|
1501
|
-
// Restore visibility
|
|
1502
|
-
// -------------------------------------------------------------------------------------------------
|
|
1503
|
-
originalVisible.forEach((visible, object) => {
|
|
1504
|
-
object.visible = visible;
|
|
1505
|
-
});
|
|
1506
|
-
// Restore state
|
|
1507
|
-
// -------------------------------------------------------------------------------------------------
|
|
1508
|
-
if (renderPassInfo.disableBackground)
|
|
1509
|
-
scene.background = originalBackground;
|
|
1510
|
-
if (overrideMaterial)
|
|
1511
|
-
scene.overrideMaterial = originalOverride;
|
|
1512
|
-
});
|
|
1513
|
-
}
|
|
1514
|
-
async renderFrame() {
|
|
1515
|
-
return this.startRendering(true);
|
|
1516
|
-
}
|
|
1517
|
-
calculateMainCanvasRect() {
|
|
1518
|
-
let rect = this.mainRenderViewport || { x: 0, y: 0, width: this.width, height: this.height };
|
|
1519
|
-
if (this.targetAspectRatio)
|
|
1520
|
-
rect = this._rectWithAspect(rect, this.targetAspectRatio);
|
|
1521
|
-
return rect;
|
|
1522
|
-
}
|
|
1523
|
-
_rectWithAspect(rect, targetAspect) {
|
|
1524
|
-
rect = structuredClone(rect);
|
|
1525
|
-
const aspect = rect.width / rect.height;
|
|
1526
|
-
if (aspect > targetAspect) {
|
|
1527
|
-
const newWidth = Math.floor(rect.height * targetAspect);
|
|
1528
|
-
rect.x += (rect.width - newWidth) / 2;
|
|
1529
|
-
rect.width = newWidth;
|
|
1530
|
-
}
|
|
1531
|
-
else {
|
|
1532
|
-
const newHeight = Math.floor(rect.width / targetAspect);
|
|
1533
|
-
rect.y += (rect.height - newHeight) / 2;
|
|
1534
|
-
rect.height = newHeight;
|
|
1535
|
-
}
|
|
1536
|
-
return rect;
|
|
1537
|
-
}
|
|
1538
|
-
async withViewport(rect, func, renderPassInfo, targetAspect) {
|
|
1539
|
-
const savedViewport = new Vector4();
|
|
1540
|
-
this.webGlRenderer.getCurrentViewport(savedViewport);
|
|
1541
|
-
let options;
|
|
1542
|
-
if (targetAspect) {
|
|
1543
|
-
rect = this._rectWithAspect(rect, targetAspect);
|
|
1544
|
-
options = { aspect: targetAspect, viewport: rect };
|
|
1545
|
-
}
|
|
1546
|
-
else {
|
|
1547
|
-
options = { viewport: rect };
|
|
1548
|
-
}
|
|
1549
|
-
if (renderPassInfo) {
|
|
1550
|
-
renderPassInfo = renderPassInfo.withResolution(rect.width, rect.height, options);
|
|
1551
|
-
}
|
|
1552
|
-
try {
|
|
1553
|
-
this.webGlRenderer.setScissorTest(true);
|
|
1554
|
-
this.webGlRenderer.setScissor(rect.x, this.height - rect.height - rect.y, rect.width, rect.height);
|
|
1555
|
-
this.webGlRenderer.setViewport(rect.x, this.height - rect.height - rect.y, rect.width, rect.height);
|
|
1556
|
-
await func(renderPassInfo);
|
|
1557
|
-
}
|
|
1558
|
-
finally {
|
|
1559
|
-
this.webGlRenderer.setViewport(savedViewport);
|
|
1560
|
-
this.webGlRenderer.setScissorTest(false);
|
|
1561
|
-
}
|
|
1562
|
-
}
|
|
1563
|
-
async _renderViewports(renderPassInfo) {
|
|
1564
|
-
// Render the main render view to either fullscreen (default) or a reduced viewport if configured
|
|
1565
|
-
// -------------------------------------------------------------------------------------------------
|
|
1566
|
-
let mainRenderViewport = this.mainRenderViewport || { x: 0, y: 0, width: this.width, height: this.height };
|
|
1567
|
-
await this.withViewport(mainRenderViewport, async (renderPassInfoMain) => {
|
|
1568
|
-
this.engine.imgui.setViewport(renderPassInfoMain.viewport);
|
|
1569
|
-
await this.mainRenderView.render(renderPassInfoMain);
|
|
1570
|
-
}, renderPassInfo, this.targetAspectRatio);
|
|
1571
|
-
// Render all additional registered render views
|
|
1572
|
-
// -------------------------------------------------------------------------------------------------
|
|
1573
|
-
for (const renderView of this.additionalRenderViewports.values()) {
|
|
1574
|
-
const { renderer, rect, name } = renderView;
|
|
1575
|
-
const renderTask = this.engine.profiler.start("Renderer", `renderView:${name}`);
|
|
1576
|
-
try {
|
|
1577
|
-
if (rect.width > 0 && rect.height > 0) {
|
|
1578
|
-
const renderPassInfoViewport = renderPassInfo.withResolution(rect.width, rect.height, { viewport: rect });
|
|
1579
|
-
await this.withViewport(rect, async () => {
|
|
1580
|
-
if (typeof (renderer) === 'function')
|
|
1581
|
-
await renderer(renderPassInfoViewport);
|
|
1582
|
-
else if (typeof (renderer) === 'object' && typeof (renderer.render) === 'function')
|
|
1583
|
-
await renderer.render(renderPassInfoViewport);
|
|
1584
|
-
});
|
|
1585
|
-
}
|
|
1586
|
-
}
|
|
1587
|
-
catch (err) {
|
|
1588
|
-
console.error("Error rendering additional render view.", err);
|
|
1589
|
-
}
|
|
1590
|
-
finally {
|
|
1591
|
-
renderTask.done();
|
|
1592
|
-
}
|
|
1593
|
-
}
|
|
1594
|
-
}
|
|
1595
|
-
getTransformControlMode() {
|
|
1596
|
-
return this.getEditorScene().getTransformControlMode();
|
|
1597
|
-
}
|
|
1598
|
-
setTransformControlMode(mode) {
|
|
1599
|
-
this.getEditorScene().setTransformControlMode(mode);
|
|
1600
|
-
}
|
|
1601
|
-
async startRendering(singleFrame = false) {
|
|
1602
|
-
const renderPassInfo = new RenderPassInfo({
|
|
1603
|
-
sceneGraphCollection: this.engine.mainSceneGraphCollection,
|
|
1604
|
-
camera: this.activeCamera,
|
|
1605
|
-
renderOptions: this.renderOptions,
|
|
1606
|
-
singleFrame: singleFrame,
|
|
1607
|
-
lastMovementMs: 0,
|
|
1608
|
-
didMove: true,
|
|
1609
|
-
cameraIsStill: false,
|
|
1610
|
-
lastPlayerTimeMs: 0,
|
|
1611
|
-
lastTimeMs: this.getCurrentTime(),
|
|
1612
|
-
screenWasResized: false,
|
|
1613
|
-
});
|
|
1614
|
-
const renderCallback = async (time) => {
|
|
1615
|
-
try {
|
|
1616
|
-
renderPassInfo.camera = this.activeCamera;
|
|
1617
|
-
this.engine.profiler.startRecord();
|
|
1618
|
-
if (!this.rendering) {
|
|
1619
|
-
this.activeCamera = undefined;
|
|
1620
|
-
return;
|
|
1621
|
-
}
|
|
1622
|
-
// Check if anything resized
|
|
1623
|
-
// ----------------------------------------------------------------------------------
|
|
1624
|
-
renderPassInfo.screenWasResized = this.checkResize();
|
|
1625
|
-
const width = this.mainRenderViewport ? this.mainRenderViewport.width : this.width;
|
|
1626
|
-
const height = this.mainRenderViewport ? this.mainRenderViewport.height : this.height;
|
|
1627
|
-
renderPassInfo.setResolution(width * window.devicePixelRatio, height * window.devicePixelRatio);
|
|
1628
|
-
// TODO: move!
|
|
1629
|
-
this.getEditorScene().checkGridSize();
|
|
1630
|
-
renderPassInfo.playerIsPaused = this.engine.player.isPaused();
|
|
1631
|
-
// Propagate editor camera matrix
|
|
1632
|
-
// ----------------------------------------------------------------------------------
|
|
1633
|
-
this.updateEditorCameraWorldMatrix();
|
|
1634
|
-
// First execute any render calls that were registered through requestFrame()
|
|
1635
|
-
// ----------------------------------------------------------------------------------
|
|
1636
|
-
this._executeRequestFrameFuncs();
|
|
1637
|
-
// Determine time and time deltas
|
|
1638
|
-
// ----------------------------------------------------------------------------------
|
|
1639
|
-
this.engine.player.updateTimes();
|
|
1640
|
-
const currentTimeMs = this.getCurrentTime();
|
|
1641
|
-
const timeDeltaMs = currentTimeMs - renderPassInfo.lastTimeMs;
|
|
1642
|
-
const currentPlayerTimeMs = this.engine.player.getGameTime();
|
|
1643
|
-
// on the first frame after stopping, the player will return a gametime of 0.
|
|
1644
|
-
// to avoid having a negative deltaPlayerTimeMs, we set lastPlayerTimeMs to 0
|
|
1645
|
-
if (renderPassInfo.lastPlayerTimeMs > currentPlayerTimeMs) {
|
|
1646
|
-
renderPassInfo.lastPlayerTimeMs = 0;
|
|
1647
|
-
}
|
|
1648
|
-
const deltaPlayerTimeMs = currentPlayerTimeMs - renderPassInfo.lastPlayerTimeMs;
|
|
1649
|
-
renderPassInfo.timeDeltaMs = timeDeltaMs;
|
|
1650
|
-
renderPassInfo.lastPlayerTimeMs = currentPlayerTimeMs;
|
|
1651
|
-
renderPassInfo.currentPlayerTimeMs = currentPlayerTimeMs;
|
|
1652
|
-
renderPassInfo.lastTimeMs = currentTimeMs;
|
|
1653
|
-
renderPassInfo.currentTimeMs = currentTimeMs;
|
|
1654
|
-
renderPassInfo.deltaPlayerTimeMs = deltaPlayerTimeMs;
|
|
1655
|
-
// Render viewports
|
|
1656
|
-
// ----------------------------------------------------------------------------------
|
|
1657
|
-
await this._renderViewports(renderPassInfo);
|
|
1658
|
-
// After rendering, update infos
|
|
1659
|
-
// ----------------------------------------------------------------------------------
|
|
1660
|
-
this.updateRender = false;
|
|
1661
|
-
this.info = {
|
|
1662
|
-
memory: tools.clone(this.webGlRenderer.info.memory),
|
|
1663
|
-
render: tools.clone(this.webGlRenderer.info.render),
|
|
1664
|
-
};
|
|
1665
|
-
this.webGlRenderer.info.reset();
|
|
1666
|
-
if (this.stats)
|
|
1667
|
-
this.stats.update();
|
|
1668
|
-
}
|
|
1669
|
-
catch (err) {
|
|
1670
|
-
console.error("Error in render loop: ", err);
|
|
1671
|
-
}
|
|
1672
|
-
finally {
|
|
1673
|
-
this.engine.profiler.endRecord();
|
|
1674
|
-
if (this.rendering && !renderPassInfo.singleFrame)
|
|
1675
|
-
requestAnimationFrame(renderCallback);
|
|
1676
|
-
}
|
|
1677
|
-
};
|
|
1678
|
-
if (singleFrame) {
|
|
1679
|
-
this.rendering = true;
|
|
1680
|
-
await renderCallback(0);
|
|
1681
|
-
this.rendering = false;
|
|
1682
|
-
}
|
|
1683
|
-
else {
|
|
1684
|
-
this.rendering = true;
|
|
1685
|
-
requestAnimationFrame(renderCallback);
|
|
1686
|
-
}
|
|
1687
|
-
}
|
|
1688
|
-
renderParticleSystems(renderPassInfo) {
|
|
1689
|
-
if (this.particleSystems && !renderPassInfo.playerIsPaused) {
|
|
1690
|
-
this.engine.profiler.measure("Particles", "render", async () => {
|
|
1691
|
-
this.particleSystems.forEach(system => {
|
|
1692
|
-
system.setSize(renderPassInfo.resolution.x, renderPassInfo.resolution.y);
|
|
1693
|
-
// in the testing environment a time provider has been set.
|
|
1694
|
-
// in that case use the testing time (incorporated in timeDeltaMs)
|
|
1695
|
-
const timeToRender = this.timeProviderSet || !this.engine.player.isPlaying()
|
|
1696
|
-
? renderPassInfo.timeDeltaMs
|
|
1697
|
-
: renderPassInfo.deltaPlayerTimeMs;
|
|
1698
|
-
system.render(timeToRender / 1000);
|
|
1699
|
-
});
|
|
1700
|
-
});
|
|
1701
|
-
}
|
|
1702
|
-
}
|
|
1703
|
-
updateViewHelper(renderPassInfo) {
|
|
1704
|
-
if (this.viewHelper) {
|
|
1705
|
-
this.viewHelper.update(renderPassInfo.timeDeltaMs / 1000);
|
|
1706
|
-
}
|
|
1707
|
-
}
|
|
1708
|
-
updateControls(renderPassInfo) {
|
|
1709
|
-
this.getEditorScene().updateControls(renderPassInfo);
|
|
1710
|
-
}
|
|
1711
|
-
stopRendering() {
|
|
1712
|
-
this.rendering = false;
|
|
1713
|
-
}
|
|
1714
|
-
updateMaterialUniforms(time, resolution) {
|
|
1715
|
-
const uniforms = {
|
|
1716
|
-
iTime: time,
|
|
1717
|
-
iResolution: resolution,
|
|
1718
|
-
};
|
|
1719
|
-
for (const material of this.materials) {
|
|
1720
|
-
let matObj;
|
|
1721
|
-
if (material instanceof Material)
|
|
1722
|
-
matObj = material;
|
|
1723
|
-
else
|
|
1724
|
-
matObj = material.getObject();
|
|
1725
|
-
if (matObj.uniforms) {
|
|
1726
|
-
for (const uniform in uniforms) {
|
|
1727
|
-
if (matObj.uniforms[uniform]) {
|
|
1728
|
-
matObj.uniforms[uniform].value = uniforms[uniform];
|
|
1729
|
-
}
|
|
1730
|
-
}
|
|
1731
|
-
}
|
|
1732
|
-
}
|
|
1733
|
-
}
|
|
1734
|
-
_waitForNextFrame() {
|
|
1735
|
-
return new Promise(requestAnimationFrame);
|
|
1736
|
-
}
|
|
1737
|
-
getChannels() {
|
|
1738
|
-
const _this = this;
|
|
1739
|
-
const channels = {};
|
|
1740
|
-
function defineChannel(field, name) {
|
|
1741
|
-
channels[field] = {
|
|
1742
|
-
name: name,
|
|
1743
|
-
available: false,
|
|
1744
|
-
_active: true,
|
|
1745
|
-
};
|
|
1746
|
-
Object.defineProperty(channels[field], "active", {
|
|
1747
|
-
get: function () {
|
|
1748
|
-
return this._active;
|
|
1749
|
-
},
|
|
1750
|
-
set: function (value) {
|
|
1751
|
-
this._active = value;
|
|
1752
|
-
for (const mat of _this.materials) {
|
|
1753
|
-
if (mat instanceof Material) {
|
|
1754
|
-
// cannot do that on three.js materials
|
|
1755
|
-
}
|
|
1756
|
-
else {
|
|
1757
|
-
mat.setChannelActive(field, value);
|
|
1758
|
-
}
|
|
1759
|
-
}
|
|
1760
|
-
_this.updateRender = true;
|
|
1761
|
-
},
|
|
1762
|
-
});
|
|
1763
|
-
}
|
|
1764
|
-
// Query one of the materials for a list of channels and define them
|
|
1765
|
-
// ----------------------------------------------------------------------
|
|
1766
|
-
const materials = this.engine.loadingManager.getItemInstancesOfType("Material");
|
|
1767
|
-
if (materials.length) {
|
|
1768
|
-
const mat = this.materials[0];
|
|
1769
|
-
if ("getChannels" in mat) {
|
|
1770
|
-
for (const channel of mat.getChannels()) {
|
|
1771
|
-
defineChannel(channel.name, channel.displayName);
|
|
1772
|
-
}
|
|
1773
|
-
}
|
|
1774
|
-
}
|
|
1775
|
-
// Now go through all of them and see which are actively used
|
|
1776
|
-
// ----------------------------------------------------------------------
|
|
1777
|
-
for (const mat of materials) {
|
|
1778
|
-
for (const channel of mat.getChannels()) {
|
|
1779
|
-
if (channel.active) {
|
|
1780
|
-
channels[channel.name].available = true;
|
|
1781
|
-
}
|
|
1782
|
-
}
|
|
1783
|
-
}
|
|
1784
|
-
return channels;
|
|
1785
|
-
}
|
|
1786
|
-
setDevicePixelRatio() {
|
|
1787
|
-
if (!this.webGlRenderer) {
|
|
1788
|
-
return;
|
|
1789
|
-
}
|
|
1790
|
-
// limit DPR to two for mobile performance
|
|
1791
|
-
const pixelRatio = Math.min(window.devicePixelRatio, 2);
|
|
1792
|
-
this.webGlRenderer.setPixelRatio(pixelRatio);
|
|
1793
|
-
}
|
|
1794
|
-
checkResize() {
|
|
1795
|
-
let changed = false;
|
|
1796
|
-
if (!this.renderView)
|
|
1797
|
-
return changed;
|
|
1798
|
-
const renderViewWidth = this.renderView.clientWidth;
|
|
1799
|
-
const renderViewHeight = this.renderView.clientHeight;
|
|
1800
|
-
let w = renderViewWidth;
|
|
1801
|
-
let h = renderViewHeight;
|
|
1802
|
-
if (this.width !== w || this.height !== h || this.viewWidth !== renderViewWidth || this.viewHeight !== renderViewHeight) {
|
|
1803
|
-
for (const func of this.onResizeFuncs) {
|
|
1804
|
-
func(w, h);
|
|
1805
|
-
}
|
|
1806
|
-
if (this.webGlRenderer) {
|
|
1807
|
-
this.webGlRenderer.setSize(w, h);
|
|
1808
|
-
this.webGlRenderer.domElement.style.position = 'absolute';
|
|
1809
|
-
this.webGlRenderer.domElement.style.top = `${(renderViewHeight - h) / 2}px`;
|
|
1810
|
-
this.webGlRenderer.domElement.style.left = `${(renderViewWidth - w) / 2}px`;
|
|
1811
|
-
}
|
|
1812
|
-
// set DPR on renderer on resize in case the window
|
|
1813
|
-
// moves between screens with different DPR
|
|
1814
|
-
this.setDevicePixelRatio();
|
|
1815
|
-
this.width = w;
|
|
1816
|
-
this.height = h;
|
|
1817
|
-
this.viewWidth = renderViewWidth;
|
|
1818
|
-
this.viewHeight = renderViewHeight;
|
|
1819
|
-
changed = true;
|
|
1820
|
-
}
|
|
1821
|
-
return changed;
|
|
1822
|
-
}
|
|
1823
|
-
removeMaterial(material) {
|
|
1824
|
-
this.materials.removeObject(material);
|
|
1825
|
-
}
|
|
1826
|
-
addMaterial(material) {
|
|
1827
|
-
this.materials.push(material);
|
|
1828
|
-
}
|
|
1829
|
-
createTexture(data, width, height) {
|
|
1830
|
-
return new DataTexture(data, width, height, RGBAFormat);
|
|
1831
|
-
}
|
|
1832
|
-
loadTexture(url) {
|
|
1833
|
-
let textureLoader = new TextureLoader();
|
|
1834
|
-
return new Promise((resolve, reject) => {
|
|
1835
|
-
textureLoader.load(url, (texture) => {
|
|
1836
|
-
resolve(texture);
|
|
1837
|
-
}, (event) => { }, (event) => {
|
|
1838
|
-
reject(event);
|
|
1839
|
-
});
|
|
1840
|
-
});
|
|
1841
|
-
}
|
|
1842
|
-
createBasicMaterial(color) {
|
|
1843
|
-
if (color === undefined)
|
|
1844
|
-
color = 0xffffff;
|
|
1845
|
-
return new MeshBasicMaterial({ color: color });
|
|
1846
|
-
}
|
|
1847
|
-
addToScene(obj) {
|
|
1848
|
-
const rootScene = this.engine.mainSceneGraphCollection.getRootScene();
|
|
1849
|
-
rootScene.add(obj);
|
|
1850
|
-
}
|
|
1851
|
-
removeFromScene(obj) {
|
|
1852
|
-
const rootScene = this.engine.mainSceneGraphCollection.getRootScene();
|
|
1853
|
-
rootScene.remove(obj);
|
|
1854
|
-
}
|
|
1855
|
-
setActiveComposition() {
|
|
1856
|
-
if (!this.activeComposition)
|
|
1857
|
-
return;
|
|
1858
|
-
this.composer.setComposition(this.activeComposition);
|
|
1859
|
-
}
|
|
1860
|
-
addParticleSystem(system) {
|
|
1861
|
-
this.particleSystems.push(system);
|
|
1862
|
-
}
|
|
1863
|
-
removeParticleSystem(system) {
|
|
1864
|
-
this.particleSystems = this.particleSystems.filter(item => item !== system);
|
|
1865
|
-
}
|
|
1866
|
-
}
|
|
1867
|
-
//# sourceMappingURL=Renderer.js.map
|