@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.
Files changed (375) hide show
  1. package/dist/engine.min.js +302 -0
  2. package/dist/player.zip +302 -0
  3. package/package.json +6 -2
  4. package/dist/Builder.js +0 -93
  5. package/dist/Builder.js.map +0 -1
  6. package/dist/Canvas.js +0 -109
  7. package/dist/Canvas.js.map +0 -1
  8. package/dist/Controllers.js +0 -97
  9. package/dist/Controllers.js.map +0 -1
  10. package/dist/EditorScene.js +0 -372
  11. package/dist/EditorScene.js.map +0 -1
  12. package/dist/Engine.js +0 -1576
  13. package/dist/Engine.js.map +0 -1
  14. package/dist/LoadingManager.js +0 -1195
  15. package/dist/LoadingManager.js.map +0 -1
  16. package/dist/LoadingState.js +0 -37
  17. package/dist/LoadingState.js.map +0 -1
  18. package/dist/Logger.js +0 -141
  19. package/dist/Logger.js.map +0 -1
  20. package/dist/Player.js +0 -470
  21. package/dist/Player.js.map +0 -1
  22. package/dist/Preview.js +0 -166
  23. package/dist/Preview.js.map +0 -1
  24. package/dist/RenderOptions.js +0 -59
  25. package/dist/RenderOptions.js.map +0 -1
  26. package/dist/RenderPassInfo.js +0 -133
  27. package/dist/RenderPassInfo.js.map +0 -1
  28. package/dist/RenderView.js +0 -459
  29. package/dist/RenderView.js.map +0 -1
  30. package/dist/Renderer.js +0 -1867
  31. package/dist/Renderer.js.map +0 -1
  32. package/dist/SceneGraph.js +0 -798
  33. package/dist/SceneGraph.js.map +0 -1
  34. package/dist/SceneGraphCollection.js +0 -614
  35. package/dist/SceneGraphCollection.js.map +0 -1
  36. package/dist/Shortcuts.js +0 -259
  37. package/dist/Shortcuts.js.map +0 -1
  38. package/dist/Tools.js +0 -500
  39. package/dist/Tools.js.map +0 -1
  40. package/dist/Variables.js +0 -243
  41. package/dist/Variables.js.map +0 -1
  42. package/dist/helpers/ArrowHelper.js +0 -104
  43. package/dist/helpers/ArrowHelper.js.map +0 -1
  44. package/dist/helpers/BoxHelper.js +0 -112
  45. package/dist/helpers/BoxHelper.js.map +0 -1
  46. package/dist/helpers/CameraHelper.js +0 -237
  47. package/dist/helpers/CameraHelper.js.map +0 -1
  48. package/dist/helpers/FaceNormalsHelper.js +0 -85
  49. package/dist/helpers/FaceNormalsHelper.js.map +0 -1
  50. package/dist/helpers/MeshHelper.js +0 -92
  51. package/dist/helpers/MeshHelper.js.map +0 -1
  52. package/dist/helpers/MultiGridHelper.js +0 -61
  53. package/dist/helpers/MultiGridHelper.js.map +0 -1
  54. package/dist/helpers/ParticlesHelper.js +0 -245
  55. package/dist/helpers/ParticlesHelper.js.map +0 -1
  56. package/dist/helpers/PointHelper.js +0 -85
  57. package/dist/helpers/PointHelper.js.map +0 -1
  58. package/dist/helpers/SphereHelper.js +0 -62
  59. package/dist/helpers/SphereHelper.js.map +0 -1
  60. package/dist/helpers/VertexNormalsHelper.js +0 -75
  61. package/dist/helpers/VertexNormalsHelper.js.map +0 -1
  62. package/dist/helpers/ViewHelper.js +0 -252
  63. package/dist/helpers/ViewHelper.js.map +0 -1
  64. package/dist/helpers/lighthelpers/DirectionalLightHelper.js +0 -136
  65. package/dist/helpers/lighthelpers/DirectionalLightHelper.js.map +0 -1
  66. package/dist/helpers/lighthelpers/HemisphereLightHelper.js +0 -124
  67. package/dist/helpers/lighthelpers/HemisphereLightHelper.js.map +0 -1
  68. package/dist/helpers/lighthelpers/PointLightHelper.js +0 -133
  69. package/dist/helpers/lighthelpers/PointLightHelper.js.map +0 -1
  70. package/dist/helpers/lighthelpers/SpotLightHelper.js +0 -123
  71. package/dist/helpers/lighthelpers/SpotLightHelper.js.map +0 -1
  72. package/dist/index.js +0 -40
  73. package/dist/index.js.map +0 -1
  74. package/dist/items/AudioCollectionItem.js +0 -230
  75. package/dist/items/AudioCollectionItem.js.map +0 -1
  76. package/dist/items/AudioItem.js +0 -75
  77. package/dist/items/AudioItem.js.map +0 -1
  78. package/dist/items/BackgroundShaderItem.js +0 -239
  79. package/dist/items/BackgroundShaderItem.js.map +0 -1
  80. package/dist/items/CanvasTextureItem.js +0 -194
  81. package/dist/items/CanvasTextureItem.js.map +0 -1
  82. package/dist/items/CompositionItem.js +0 -110
  83. package/dist/items/CompositionItem.js.map +0 -1
  84. package/dist/items/FontItem.js +0 -135
  85. package/dist/items/FontItem.js.map +0 -1
  86. package/dist/items/GaussianSplatsItem.js +0 -103
  87. package/dist/items/GaussianSplatsItem.js.map +0 -1
  88. package/dist/items/GridMapItem.js +0 -202
  89. package/dist/items/GridMapItem.js.map +0 -1
  90. package/dist/items/ImageItem.js +0 -255
  91. package/dist/items/ImageItem.js.map +0 -1
  92. package/dist/items/Item.js +0 -739
  93. package/dist/items/Item.js.map +0 -1
  94. package/dist/items/MaterialCollectionItem.js +0 -216
  95. package/dist/items/MaterialCollectionItem.js.map +0 -1
  96. package/dist/items/MaterialItem.js +0 -1762
  97. package/dist/items/MaterialItem.js.map +0 -1
  98. package/dist/items/MeshCollectionItem.js +0 -258
  99. package/dist/items/MeshCollectionItem.js.map +0 -1
  100. package/dist/items/MeshItem.js +0 -274
  101. package/dist/items/MeshItem.js.map +0 -1
  102. package/dist/items/ParticlesItem.js +0 -187
  103. package/dist/items/ParticlesItem.js.map +0 -1
  104. package/dist/items/PixelShaderItem.js +0 -42
  105. package/dist/items/PixelShaderItem.js.map +0 -1
  106. package/dist/items/PointsItem.js +0 -122
  107. package/dist/items/PointsItem.js.map +0 -1
  108. package/dist/items/PrefabItem.js +0 -140
  109. package/dist/items/PrefabItem.js.map +0 -1
  110. package/dist/items/ProjectItem.js +0 -857
  111. package/dist/items/ProjectItem.js.map +0 -1
  112. package/dist/items/SceneItem.js +0 -443
  113. package/dist/items/SceneItem.js.map +0 -1
  114. package/dist/items/ScriptItem.js +0 -159
  115. package/dist/items/ScriptItem.js.map +0 -1
  116. package/dist/items/VariableSetItem.js +0 -208
  117. package/dist/items/VariableSetItem.js.map +0 -1
  118. package/dist/items/VertexShaderItem.js +0 -42
  119. package/dist/items/VertexShaderItem.js.map +0 -1
  120. package/dist/items/VideoItem.js +0 -152
  121. package/dist/items/VideoItem.js.map +0 -1
  122. package/dist/items/base/ImageOwningItem.js +0 -205
  123. package/dist/items/base/ImageOwningItem.js.map +0 -1
  124. package/dist/items/base/MeshBase.js +0 -342
  125. package/dist/items/base/MeshBase.js.map +0 -1
  126. package/dist/items/base/ShaderBase.js +0 -115
  127. package/dist/items/base/ShaderBase.js.map +0 -1
  128. package/dist/items/helpers/ListEntry.js +0 -113
  129. package/dist/items/helpers/ListEntry.js.map +0 -1
  130. package/dist/items/helpers/ListField.js +0 -210
  131. package/dist/items/helpers/ListField.js.map +0 -1
  132. package/dist/items/helpers/MappingSetup.js +0 -126
  133. package/dist/items/helpers/MappingSetup.js.map +0 -1
  134. package/dist/json/packageVersionInfo.json +0 -6
  135. package/dist/json/shortcuts.json +0 -37
  136. package/dist/renderers/ForwardRenderer.js +0 -50
  137. package/dist/renderers/ForwardRenderer.js.map +0 -1
  138. package/dist/renderers/RendererBase.js +0 -38
  139. package/dist/renderers/RendererBase.js.map +0 -1
  140. package/dist/scenegraph/SgAudio.js +0 -286
  141. package/dist/scenegraph/SgAudio.js.map +0 -1
  142. package/dist/scenegraph/SgAudioListener.js +0 -64
  143. package/dist/scenegraph/SgAudioListener.js.map +0 -1
  144. package/dist/scenegraph/SgBillboard.js +0 -150
  145. package/dist/scenegraph/SgBillboard.js.map +0 -1
  146. package/dist/scenegraph/SgBox.js +0 -54
  147. package/dist/scenegraph/SgBox.js.map +0 -1
  148. package/dist/scenegraph/SgCamera.js +0 -219
  149. package/dist/scenegraph/SgCamera.js.map +0 -1
  150. package/dist/scenegraph/SgCircleShadow.js +0 -105
  151. package/dist/scenegraph/SgCircleShadow.js.map +0 -1
  152. package/dist/scenegraph/SgCone.js +0 -61
  153. package/dist/scenegraph/SgCone.js.map +0 -1
  154. package/dist/scenegraph/SgCylinder.js +0 -62
  155. package/dist/scenegraph/SgCylinder.js.map +0 -1
  156. package/dist/scenegraph/SgGaussianSplats.js +0 -103
  157. package/dist/scenegraph/SgGaussianSplats.js.map +0 -1
  158. package/dist/scenegraph/SgGridMap.js +0 -112
  159. package/dist/scenegraph/SgGridMap.js.map +0 -1
  160. package/dist/scenegraph/SgGroup.js +0 -40
  161. package/dist/scenegraph/SgGroup.js.map +0 -1
  162. package/dist/scenegraph/SgItem.js +0 -1427
  163. package/dist/scenegraph/SgItem.js.map +0 -1
  164. package/dist/scenegraph/SgItemScript.js +0 -117
  165. package/dist/scenegraph/SgItemScript.js.map +0 -1
  166. package/dist/scenegraph/SgLightsource.js +0 -319
  167. package/dist/scenegraph/SgLightsource.js.map +0 -1
  168. package/dist/scenegraph/SgLod.js +0 -82
  169. package/dist/scenegraph/SgLod.js.map +0 -1
  170. package/dist/scenegraph/SgMesh.js +0 -662
  171. package/dist/scenegraph/SgMesh.js.map +0 -1
  172. package/dist/scenegraph/SgNavMesh.js +0 -503
  173. package/dist/scenegraph/SgNavMesh.js.map +0 -1
  174. package/dist/scenegraph/SgParticles.js +0 -796
  175. package/dist/scenegraph/SgParticles.js.map +0 -1
  176. package/dist/scenegraph/SgPhysicsItem.js +0 -806
  177. package/dist/scenegraph/SgPhysicsItem.js.map +0 -1
  178. package/dist/scenegraph/SgPhysicsSubItem.js +0 -449
  179. package/dist/scenegraph/SgPhysicsSubItem.js.map +0 -1
  180. package/dist/scenegraph/SgPlane.js +0 -47
  181. package/dist/scenegraph/SgPlane.js.map +0 -1
  182. package/dist/scenegraph/SgPoints.js +0 -143
  183. package/dist/scenegraph/SgPoints.js.map +0 -1
  184. package/dist/scenegraph/SgPositionalAudio.js +0 -93
  185. package/dist/scenegraph/SgPositionalAudio.js.map +0 -1
  186. package/dist/scenegraph/SgPrefab.js +0 -153
  187. package/dist/scenegraph/SgPrefab.js.map +0 -1
  188. package/dist/scenegraph/SgProceduralGeometryItem.js +0 -146
  189. package/dist/scenegraph/SgProceduralGeometryItem.js.map +0 -1
  190. package/dist/scenegraph/SgResourceOwner.js +0 -127
  191. package/dist/scenegraph/SgResourceOwner.js.map +0 -1
  192. package/dist/scenegraph/SgRibbon.js +0 -107
  193. package/dist/scenegraph/SgRibbon.js.map +0 -1
  194. package/dist/scenegraph/SgRing.js +0 -49
  195. package/dist/scenegraph/SgRing.js.map +0 -1
  196. package/dist/scenegraph/SgRoot.js +0 -87
  197. package/dist/scenegraph/SgRoot.js.map +0 -1
  198. package/dist/scenegraph/SgScriptedMesh.js +0 -213
  199. package/dist/scenegraph/SgScriptedMesh.js.map +0 -1
  200. package/dist/scenegraph/SgSky.js +0 -126
  201. package/dist/scenegraph/SgSky.js.map +0 -1
  202. package/dist/scenegraph/SgSphere.js +0 -59
  203. package/dist/scenegraph/SgSphere.js.map +0 -1
  204. package/dist/scenegraph/SgText.js +0 -182
  205. package/dist/scenegraph/SgText.js.map +0 -1
  206. package/dist/scenegraph/SgTorus.js +0 -48
  207. package/dist/scenegraph/SgTorus.js.map +0 -1
  208. package/dist/scenegraph/SgVehicle.js +0 -370
  209. package/dist/scenegraph/SgVehicle.js.map +0 -1
  210. package/dist/subsystems/AudioSystem.js +0 -128
  211. package/dist/subsystems/AudioSystem.js.map +0 -1
  212. package/dist/subsystems/Billboard.js +0 -190
  213. package/dist/subsystems/Billboard.js.map +0 -1
  214. package/dist/subsystems/FontLoader.js +0 -161
  215. package/dist/subsystems/FontLoader.js.map +0 -1
  216. package/dist/subsystems/Physics.js +0 -1079
  217. package/dist/subsystems/Physics.js.map +0 -1
  218. package/dist/subsystems/Ribbons.js +0 -179
  219. package/dist/subsystems/Ribbons.js.map +0 -1
  220. package/dist/subsystems/gridmap/GridMapBuilder.js +0 -430
  221. package/dist/subsystems/gridmap/GridMapBuilder.js.map +0 -1
  222. package/dist/subsystems/imgui/ImGui.js +0 -742
  223. package/dist/subsystems/imgui/ImGui.js.map +0 -1
  224. package/dist/subsystems/importer/Converter.js +0 -199
  225. package/dist/subsystems/importer/Converter.js.map +0 -1
  226. package/dist/subsystems/importer/ImageConverter.js +0 -77
  227. package/dist/subsystems/importer/ImageConverter.js.map +0 -1
  228. package/dist/subsystems/importer/Importer.js +0 -381
  229. package/dist/subsystems/importer/Importer.js.map +0 -1
  230. package/dist/subsystems/importer/MeshConverter.js +0 -595
  231. package/dist/subsystems/importer/MeshConverter.js.map +0 -1
  232. package/dist/subsystems/particlesystem/CurlNoiseTexturePreview.js +0 -127
  233. package/dist/subsystems/particlesystem/CurlNoiseTexturePreview.js.map +0 -1
  234. package/dist/subsystems/particlesystem/Emitters/CircleEmitter.js +0 -135
  235. package/dist/subsystems/particlesystem/Emitters/CircleEmitter.js.map +0 -1
  236. package/dist/subsystems/particlesystem/Emitters/ConeEmitter.js +0 -192
  237. package/dist/subsystems/particlesystem/Emitters/ConeEmitter.js.map +0 -1
  238. package/dist/subsystems/particlesystem/Emitters/CubeEmitter.js +0 -157
  239. package/dist/subsystems/particlesystem/Emitters/CubeEmitter.js.map +0 -1
  240. package/dist/subsystems/particlesystem/Emitters/EdgeEmitter.js +0 -133
  241. package/dist/subsystems/particlesystem/Emitters/EdgeEmitter.js.map +0 -1
  242. package/dist/subsystems/particlesystem/Emitters/Emitter.js +0 -107
  243. package/dist/subsystems/particlesystem/Emitters/Emitter.js.map +0 -1
  244. package/dist/subsystems/particlesystem/Emitters/HemiSphereEmitter.js +0 -142
  245. package/dist/subsystems/particlesystem/Emitters/HemiSphereEmitter.js.map +0 -1
  246. package/dist/subsystems/particlesystem/Emitters/MeshEmitter.js +0 -56
  247. package/dist/subsystems/particlesystem/Emitters/MeshEmitter.js.map +0 -1
  248. package/dist/subsystems/particlesystem/Emitters/SphereEmitter.js +0 -142
  249. package/dist/subsystems/particlesystem/Emitters/SphereEmitter.js.map +0 -1
  250. package/dist/subsystems/particlesystem/Emitters/TorusEmitter.js +0 -159
  251. package/dist/subsystems/particlesystem/Emitters/TorusEmitter.js.map +0 -1
  252. package/dist/subsystems/particlesystem/ParticleSystem.js +0 -706
  253. package/dist/subsystems/particlesystem/ParticleSystem.js.map +0 -1
  254. package/dist/subsystems/particlesystem/Simulation.js +0 -475
  255. package/dist/subsystems/particlesystem/Simulation.js.map +0 -1
  256. package/dist/subsystems/particlesystem/Visualization.js +0 -518
  257. package/dist/subsystems/particlesystem/Visualization.js.map +0 -1
  258. package/dist/subsystems/particlesystem/shaders/noise/CurlNoiseTexturePreviewShader.js +0 -56
  259. package/dist/subsystems/particlesystem/shaders/noise/CurlNoiseTexturePreviewShader.js.map +0 -1
  260. package/dist/subsystems/particlesystem/utils.js +0 -115
  261. package/dist/subsystems/particlesystem/utils.js.map +0 -1
  262. package/dist/subsystems/scripting/ScriptEngine.js +0 -1074
  263. package/dist/subsystems/scripting/ScriptEngine.js.map +0 -1
  264. package/dist/subsystems/scripting/ScriptRunner.js +0 -153
  265. package/dist/subsystems/scripting/ScriptRunner.js.map +0 -1
  266. package/dist/subsystems/scripting/ScriptRuntime.js +0 -244
  267. package/dist/subsystems/scripting/ScriptRuntime.js.map +0 -1
  268. package/dist/subsystems/scripting/runtime/RtAudio.js +0 -37
  269. package/dist/subsystems/scripting/runtime/RtAudio.js.map +0 -1
  270. package/dist/subsystems/scripting/runtime/RtBase.js +0 -117
  271. package/dist/subsystems/scripting/runtime/RtBase.js.map +0 -1
  272. package/dist/subsystems/scripting/runtime/RtCanvas.js +0 -326
  273. package/dist/subsystems/scripting/runtime/RtCanvas.js.map +0 -1
  274. package/dist/subsystems/scripting/runtime/RtComposer.js +0 -58
  275. package/dist/subsystems/scripting/runtime/RtComposer.js.map +0 -1
  276. package/dist/subsystems/scripting/runtime/RtConsole.js +0 -51
  277. package/dist/subsystems/scripting/runtime/RtConsole.js.map +0 -1
  278. package/dist/subsystems/scripting/runtime/RtControllers.js +0 -52
  279. package/dist/subsystems/scripting/runtime/RtControllers.js.map +0 -1
  280. package/dist/subsystems/scripting/runtime/RtEvents.js +0 -46
  281. package/dist/subsystems/scripting/runtime/RtEvents.js.map +0 -1
  282. package/dist/subsystems/scripting/runtime/RtImGui.js +0 -410
  283. package/dist/subsystems/scripting/runtime/RtImGui.js.map +0 -1
  284. package/dist/subsystems/scripting/runtime/RtItem.js +0 -297
  285. package/dist/subsystems/scripting/runtime/RtItem.js.map +0 -1
  286. package/dist/subsystems/scripting/runtime/RtLoader.js +0 -77
  287. package/dist/subsystems/scripting/runtime/RtLoader.js.map +0 -1
  288. package/dist/subsystems/scripting/runtime/RtObject.js +0 -34
  289. package/dist/subsystems/scripting/runtime/RtObject.js.map +0 -1
  290. package/dist/subsystems/scripting/runtime/RtPhysics.js +0 -69
  291. package/dist/subsystems/scripting/runtime/RtPhysics.js.map +0 -1
  292. package/dist/subsystems/scripting/runtime/RtPointer.js +0 -45
  293. package/dist/subsystems/scripting/runtime/RtPointer.js.map +0 -1
  294. package/dist/subsystems/scripting/runtime/RtProject.js +0 -66
  295. package/dist/subsystems/scripting/runtime/RtProject.js.map +0 -1
  296. package/dist/subsystems/scripting/runtime/RtRenderer.js +0 -138
  297. package/dist/subsystems/scripting/runtime/RtRenderer.js.map +0 -1
  298. package/dist/subsystems/scripting/runtime/RtSceneEntry.js +0 -67
  299. package/dist/subsystems/scripting/runtime/RtSceneEntry.js.map +0 -1
  300. package/dist/subsystems/scripting/runtime/RtSceneObject.js +0 -666
  301. package/dist/subsystems/scripting/runtime/RtSceneObject.js.map +0 -1
  302. package/dist/subsystems/scripting/runtime/RtStorage.js +0 -64
  303. package/dist/subsystems/scripting/runtime/RtStorage.js.map +0 -1
  304. package/dist/subsystems/scripting/runtime/RtSystem.js +0 -85
  305. package/dist/subsystems/scripting/runtime/RtSystem.js.map +0 -1
  306. package/dist/subsystems/scripting/runtime/RtTools.js +0 -37
  307. package/dist/subsystems/scripting/runtime/RtTools.js.map +0 -1
  308. package/dist/subsystems/scripting/runtime/RtVariables.js +0 -57
  309. package/dist/subsystems/scripting/runtime/RtVariables.js.map +0 -1
  310. package/dist/subsystems/scripting/runtime/items/RtCanvasTexture.js +0 -101
  311. package/dist/subsystems/scripting/runtime/items/RtCanvasTexture.js.map +0 -1
  312. package/dist/subsystems/scripting/runtime/items/RtMaterial.js +0 -34
  313. package/dist/subsystems/scripting/runtime/items/RtMaterial.js.map +0 -1
  314. package/dist/subsystems/scripting/runtime/items/RtMesh.js +0 -34
  315. package/dist/subsystems/scripting/runtime/items/RtMesh.js.map +0 -1
  316. package/dist/subsystems/scripting/runtime/items/RtTexture.js +0 -34
  317. package/dist/subsystems/scripting/runtime/items/RtTexture.js.map +0 -1
  318. package/dist/subsystems/scripting/runtime/items/RtVideo.js +0 -56
  319. package/dist/subsystems/scripting/runtime/items/RtVideo.js.map +0 -1
  320. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgAudio.js +0 -59
  321. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgAudio.js.map +0 -1
  322. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgCamera.js +0 -134
  323. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgCamera.js.map +0 -1
  324. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgMesh.js +0 -99
  325. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgMesh.js.map +0 -1
  326. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgNavMesh.js +0 -114
  327. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgNavMesh.js.map +0 -1
  328. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgParticles.js +0 -576
  329. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgParticles.js.map +0 -1
  330. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgPositionalAudio.js +0 -56
  331. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgPositionalAudio.js.map +0 -1
  332. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgRibbon.js +0 -42
  333. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgRibbon.js.map +0 -1
  334. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgScriptedMesh.js +0 -65
  335. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgScriptedMesh.js.map +0 -1
  336. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgVehicle.js +0 -60
  337. package/dist/subsystems/scripting/runtime/sceneobjects/RtSgVehicle.js.map +0 -1
  338. package/dist/tools/AsyncInterval.js +0 -55
  339. package/dist/tools/AsyncInterval.js.map +0 -1
  340. package/dist/tools/Converters.js +0 -41
  341. package/dist/tools/Converters.js.map +0 -1
  342. package/dist/tools/DebugTools.js +0 -91
  343. package/dist/tools/DebugTools.js.map +0 -1
  344. package/dist/tools/FontTools.js +0 -43
  345. package/dist/tools/FontTools.js.map +0 -1
  346. package/dist/tools/FsShader.js +0 -112
  347. package/dist/tools/FsShader.js.map +0 -1
  348. package/dist/tools/GeometryTools.js +0 -373
  349. package/dist/tools/GeometryTools.js.map +0 -1
  350. package/dist/tools/ItemTools.js +0 -139
  351. package/dist/tools/ItemTools.js.map +0 -1
  352. package/dist/tools/MathHelpers.js +0 -125
  353. package/dist/tools/MathHelpers.js.map +0 -1
  354. package/dist/tools/Profiler.js +0 -174
  355. package/dist/tools/Profiler.js.map +0 -1
  356. package/dist/tools/Random.js +0 -48
  357. package/dist/tools/Random.js.map +0 -1
  358. package/dist/tools/RtDebugger.js +0 -84
  359. package/dist/tools/RtDebugger.js.map +0 -1
  360. package/dist/tools/StringExtensions.js +0 -72
  361. package/dist/tools/StringExtensions.js.map +0 -1
  362. package/dist/tools/TextureTools.js +0 -444
  363. package/dist/tools/TextureTools.js.map +0 -1
  364. package/dist/tools/Timer.js +0 -52
  365. package/dist/tools/Timer.js.map +0 -1
  366. package/dist/tools/audioVisualizers/WavyAudioVisualizer.js +0 -59
  367. package/dist/tools/audioVisualizers/WavyAudioVisualizer.js.map +0 -1
  368. /package/dist/renderers/{forwardrenderer.d.ts → ForwardRenderer.d.ts} +0 -0
  369. /package/dist/subsystems/imgui/{imgui.d.ts → ImGui.d.ts} +0 -0
  370. /package/dist/subsystems/importer/{imageconverter.d.ts → ImageConverter.d.ts} +0 -0
  371. /package/dist/subsystems/scripting/{scriptrunner.d.ts → ScriptRunner.d.ts} +0 -0
  372. /package/dist/subsystems/scripting/{scriptruntime.d.ts → ScriptRuntime.d.ts} +0 -0
  373. /package/dist/subsystems/scripting/runtime/{rtAudio.d.ts → RtAudio.d.ts} +0 -0
  374. /package/dist/subsystems/scripting/runtime/{rtComposer.d.ts → RtComposer.d.ts} +0 -0
  375. /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